java.util.concurrent.locks.ReentrantReadWriteLock的文档
免责声明:我不太擅长Java,只是比较C#和Java之间的读/写锁,以便更好地理解这个主题&这两种实现背后的决策 。它说明了锁的升级/降级:java.util.concurrent.locks.ReentrantReadWriteLock的文档,java,reentrantreadwritelock,Java,Reentrantreadwritelock,免责声明:我不太擅长Java,只是比较C#和Java之间的读/写锁,以便更好地理解这个主题&这两种实现背后的决策 。它说明了锁的升级/降级: 锁定降级。。。但是,不可能从读锁升级到写锁 它还有以下示例,显示从读锁手动升级到写锁: // Here is a code sketch showing how to exploit reentrancy // to perform lock downgrading after updating a cache void processCac
- 锁定降级。。。但是,不可能从读锁升级到写锁李>
// 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){//重新检查
来处理此情况。是的,您是对的。但是此代码通过调用if(!cacheValid)来处理此情况{//获取写锁后再次检查
。谢谢,没有注意重复检查'cacheValid'变量是否诚实谢谢,没有注意重复检查'cacheValid'变量是否诚实