免责声明:我不擅长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行和第1行之间没有锁定#2和底层结构暴露于来自其他线程的更改。所以它不能被认为是升级锁的正确方法,还是我错过了什么?
答案 0 :(得分:1)
是的,你是对的。但是这段代码通过在获取写锁定后再次调用if (!cacheValid) { // recheck
来处理这种情况。