免责声明:我不太擅长 Java,只是比较 C# 和 Java 之间的读/写锁,以更好地理解这个主题和两种实现背后的决策。
有关于 ReentrantReadWriteLock 的 JavaDoc。它说明了有关锁的升级/降级的以下内容:
- 锁降级...... 但是,从读锁升级到写锁是不可能的。
它还有以下示例,显示了从读锁到写锁的手动升级:
// Here is a code sketch showing how to exploit reentrancy
// to perform lock downgrading after updating a cache
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// upgrade lock manually
#1: rwl.readLock().unlock(); // must unlock first to obtain writelock
#2: rwl.writeLock().lock();
if (!cacheValid) { // recheck
...
}
...
}
use(data);
rwl.readLock().unlock();
这是否意味着实际上上面的示例在某些情况下可能无法正确运行 - 我的意思是第 1 行和第 2 行之间没有锁定,并且底层结构暴露于其他线程的更改。所以它不能被认为是升级锁的正确方法还是我在这里错过了什么?