2

假设我有一些想要同步访问的资源。大多数这些访问都是只读的。我想一次允许尽可能多的只读访问系统可以处理。但是,我希望能够停止阅读,进行一些写入,然后再次允许阅读。

所以读取线程可能看起来像这样

Resource r = null;
readLock.acquire();
r = resources.get();
readLock.release();

任何数量的线程都可以同时执行此操作,这不是问题。

写线程看起来像这样:

readLock.acquireOnlyMe(); // waits for all other threads to relase
                          // all other threads block when they try to acquire
r = resources.get();
r.setData(data);
readLock.release();

现在,我正在使用ReentrantLock既可读取又可写入的 a 。但显然,当我宁愿它们同时工作时,这会导致读取按顺序工作。

我能做些什么来解决这个问题?

这似乎被称为读者-作者问题,wiki 条目列出了一些 C 实现,但没有用于 Java。

编辑:我对任何可以完成工作的 Java 库持开放态度。标题说 java.util.concurrent 是因为答案似乎很可能就在那儿。

4

1 回答 1

2

如果您想将编写器线程限制为一个,那么 ReentrantReadWriteLock 将是您的人选。

不止一个 - 你可能想使用信号量锁定你的作家。我建议将初始许可计数基于核心数量 - 可能是核心+1。

于 2012-04-12T16:46:36.290 回答