什么是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之间的关系,但是我无法从文档中获得清晰的概念。您能再给我一点解释吗?谢谢!
最佳答案
我认为,在这种情况下,“升级”和“降级”的思想是基于这样的思想,即在某种意义上,读者锁比作家锁更“弱”。当获取写锁时,其他任何线程都无法以任何形式获取该锁,而使用读取器锁时,如果需要,任何其他线程都可以获取读锁。
在这里,“降级”该锁意味着如果您持有写锁,则可以通过获取读锁然后释放写锁来切换为仅持有读锁。这意味着您可以让一个线程开始执行非常重要的事情(该行为会阻止其他线程读取),执行其工作,然后切换到较低优先级的锁(读取锁),而不必离开该锁。这使您可以连续持有锁而不会被抢占。
但是,另一种方法不起作用-持有读取锁后,就无法通过尝试获取写入锁来“升级”至持有更重要的写入锁。如果您尝试执行此操作,则线程将一直阻塞直到被中断。
希望这可以帮助!