什么java.util.concurrent类允许我组织我的读/写?

时间:2012-04-10 20:02:55

标签: java java.util.concurrent

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

因此读取线程可能看起来像这样

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作为读写。但显然,当我宁愿它们同时工作时,这会导致读取按顺序工作。

我该怎么做才能解决这个问题?

看来这是known as the readers-writers problem,wiki条目列出了一些C实现,但没有列出Java。

编辑:我对任何可以完成工作的Java库开放。标题是java.util.concurrent,因为答案很可能就在那里。

1 个答案:

答案 0 :(得分:2)

如果你想将编写器线程限制为1,那么ReentrantReadWriteLock就是你的男人。

对于多个 - 您可能想要使用信号量来锁定您的作家。我建议将初始许可数基于核心数 - 可能是核心+ 1。