卢声远*_* Lu 8 java concurrency locking upgrade
什么是升级/降级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();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道它讨论了readLock和writeLock之间的关系,但我无法从doc获得清晰的概念.你能给我一点解释吗?谢谢!
tem*_*def 13
我相信在这种情况下,"升级"和"降级"的想法是基于这样一种观点,即读者锁在某种意义上是比作家锁更"弱"的锁.当获取写入锁定时,没有其他线程可以以任何形式获取锁定,而使用读取器锁定任何其他线程都可以获取读取锁定.
这里,"降级"锁意味着如果你持有写锁,你可以通过获取读锁来切换到只保持读锁,然后释放写锁.这意味着你可以让一个线程开始做一些非常重要的事情(阻止其他线程读取的东西),它的工作,然后切换到优先级较低的锁(读锁),而不是没有锁.这使您可以连续保持锁定而不会被抢占.
但是,另一种方法不起作用 - 一旦你持有读锁定,就不能通过尝试获取写锁来"升级"为保持更重要的写锁定.如果您尝试这样做,线程将阻塞直到它被中断.
希望这可以帮助!