免责声明:我不太擅长Java,只是比较C#和Java之间的读/写锁,以更好地理解该主题以及两个实现背后的决策。
There is JavaDoc about ReentrantReadWriteLock。它说明了有关锁升级/降级的以下内容:
锁降级...但是,无法从读锁升级到写锁。
它还具有以下示例,该示例显示了从读取锁定到写入锁定的手动升级:
// 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行之间没有锁定,并且底层结构暴露于其他线程的变化。因此,它不能被视为升级锁的正确方法,还是我在这里错过了什么?
最佳答案
你是对的。但是,此代码在获得写锁定后通过再次调用if (!cacheValid) { // recheck
来处理这种情况。