【发布时间】:2013-01-11 14:04:36
【问题描述】:
使用模式源于以下原因:
如果条件不存在,我需要读取线程来等待数据。
读锁不支持条件,所以条件应取自写锁。
由于读线程会等待条件,它也应该获取写锁来等待。
我在课堂上有以下锁定义:
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
protected final Lock readLock = rwl.readLock();
protected final Lock writeLock = rwl.writeLock();
protected final Condition hasData = writeLock.newCondition();
在我的 writer 方法中,我有以下模式:
try {
writeLock.lock();
//...
if( something_written ) {
hasData.signalAll();
}
}
finally {
writeLock.unlock();
}
在我的阅读方法中,我有以下模式
try {
readLock.lock();
while( data_absent ) {
// I need to acquire write lock to wait for condition!
try {
// first releasing read lock since we can't acquire write lock otherwise
// unfortunately this won't release a lock if it was acquired more than once (reentrant)
readLock.unlock();
// acquiring write lock to wait it's condition
writeLock.lock();
hasData.await(1000, TimeUnit.MILLISECONDS);
}
finally {
// releasing write lock back
writeLock.unlock();
// reacquiring read lock
// again see note about reentrancy
readLock.lock();
}
}
// reading
}
finally {
readLock.unlock();
}
上面的模式正确吗?
问题是如果reader是可重入的,即多次锁定read,那么释放代码不起作用,reader在获取写锁的那一行挂起。
【问题讨论】:
-
只是一些观察...您缺少用于嵌套锁定/解锁的
try-finally构造。按照惯例,您应该在try块之外使用lock。 -
为什么你已经获得
readlock而获得writelock(反之亦然)?这不是使用它们的正确方法。看看API -
顺便说一句,如果可能的话,我建议使用 Java 并发
Queues 之一来解决您的问题(这看起来像是典型的生产者/消费者问题)。 -
@ortang 队列不匹配。
-
@Dims 似乎 ReentrantReadWriteLock 也不匹配。你没有指定你想做什么......
标签: java multithreading concurrency reentrantreadwritelock