什么是ReentrantReadWriteLock的升级/降级?我看到javadoc关于升级/降级:
锁定降级:可重入性还允许将写入锁降级为读锁,方法是获取写锁,然后读取锁,然后释放写锁。然而,从读锁升级到写锁是不可能的。
并提供了一个样本:
class CachedData {
Object data;
volatile boolean cacheValid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// upgrade lock manually
rwl.readLock().unlock(); // must unlock first to obtain writelock
rwl.writeLock().lock();
if (!cacheValid) { // recheck
data = ...
cacheValid = true;
}
// downgrade lock
rwl.readLock().lock(); // reacquire read without giving up write lock
rwl.writeLock().unlock(); // unlock write, still hold read
}
use(data);
rwl.readLock().unlock();
}
}我知道它谈到了readLock和writeLock之间的关系,但我无法从文档中获得明确的概念。你能再给我解释一下吗?谢谢!
发布于 2011-02-21 05:25:54
我认为,在这种情况下,“升级”和“降级”的想法是基于读者锁在某种意义上是一个“较弱”的锁比作家锁。当获得写锁时,没有其他线程可以以任何形式获取该锁,而使用读取器锁,任何其他线程都可以获得读锁(如果需要的话)。
在这里,“降级”锁意味着,如果您持有写锁,您可以切换到只持有读锁,通过获取读锁,然后释放写锁。这意味着您可以让一个线程开始做一些非常重要的事情(这会阻止其他线程读取),完成它的工作,然后切换到优先级较低的锁(读锁),而不会没有锁。这使您可以连续持有锁,而不被抢占。
然而,另一种方法不起作用--一旦你持有读锁,你就不能通过尝试获取写锁来“升级”到持有更重要的写锁。如果您尝试这样做,线程只会阻塞直到被中断。
希望这能有所帮助!
https://stackoverflow.com/questions/5062594
复制相似问题