【发布时间】:2012-10-26 13:59:35
【问题描述】:
据说ReentrantReadWriteLock 是为一个作者和多个读者准备的。
不过,读者应该等到缓冲区中出现一些数据。
那么,要锁定什么?
我创建了如下并发对象:
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
protected final Lock readLock = rwl.readLock();
protected final Lock writeLock = rwl.writeLock();
protected final Condition hasData = writeLock.newCondition();
现在我在写方法:
writeLock.lock();
// writing first portion and updating variables
hasData.signalAll();
// if required then writing second portion and updating variables
hasData.signalAll();
但是如何写一个读者呢?它应该只获取readLock吗?但它怎么能等待信号呢?如果它还需要writeLock,那么读/写锁定的至高无上的地位在哪里?
如果所需变量仅受writeLock保护,如何确保它们在读取过程中不会改变?
队列与任务不匹配
这是关于ReentrantReadWriteLock的问题。
【问题讨论】:
-
您可能会发现 Disruptor 库很有趣,因为它很好地解决了这类问题。 code.google.com/p/disruptor
-
阻塞队列做匹配任务,因为它被解释了。为什么你的意思是在所有情况下都写数据?您可以设置,以便写入永远不会失败。
-
我已经调整了我的答案@UmNyobe。最初它没有处理她想丢弃最旧的数据以在队列中腾出空间的情况。阻塞队列现在应该可以处理更改了。
-
@UmNyobe 任务没有完整解释。问题是关于
ReentrantReadWriteLock,而不是关于如何解决任务。 -
奇怪的是不是在寻找解决方案,而是无论如何。要考虑@SuzanCioc 的一件事是,如果您正在执行 IO,您很可能会浪费时间过早地优化锁定,因为您的应用程序将受 IO 限制。
标签: java concurrency java.util.concurrent reentrantreadwritelock