Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.concurrent.locks.ReentrantReadWriteLock的文档_Java_Reentrantreadwritelock - Fatal编程技术网

java.util.concurrent.locks.ReentrantReadWriteLock的文档

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

免责声明:我不太擅长Java,只是比较C#和Java之间的读/写锁,以便更好地理解这个主题&这两种实现背后的决策

。它说明了锁的升级/降级:

  • 锁定降级。。。但是,不可能从读锁升级到写锁
它还有以下示例,显示从读锁手动升级到写锁:

 // 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'变量是否诚实