您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> 企业IT >> 在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?

在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?

来源:网络整理     时间:2018/1/23 2:13:13     关键词:

关于网友提出的“ 在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?”问题疑问,本网通过在网上对“ 在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?
描述:

在查看ReentrantReadWriteLock的官方文档中看到了一个关于锁降级的例子代码:

 class CachedData {
   Object data;
   volatile boolean cacheValid;
   final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
       // Must release read lock before acquiring write lock
       rwl.readLock().unlock();
       rwl.writeLock().lock();
       try {
         // Recheck state because another thread might have
         // acquired write lock and changed state before we did.
         if (!cacheValid) {
           data = ...
           cacheValid = true;
         }
         // Downgrade by acquiring read lock before releasing write lock
         rwl.readLock().lock();
       } finally {
         rwl.writeLock().unlock(); // Unlock write, still hold read
       }
     }

     try {
       use(data);
     } finally {
       rwl.readLock().unlock();
     }
   }
 }

这里,在释放写锁前需要先申请读锁,也既锁降级。具体原因是,如果不先获取读锁就释放写锁,那么在执行后面的use(data)时,data有可能被其它线程修改。而由于一个线程对于共享变量的修改对另一个线程来说是不可见的,所以会导致错误。这里,请问,如果我把data变量用volatile修饰,通过volatile来保证可见性的话,是否还需要使用锁降级呢?不知道我对于volatile保证可见性的理解是否正确?


解决方案1:

这里锁释放时,会把data刷会共享内存及主内存的。不存在可见性了吧 锁降级的主要目的应该还是在逻辑上。我觉得因为写读互斥,所以我们一直持有写锁的话,其他线程就无法读了,所以

解决方案2:

我根本无法理解为什么要降级,你用写锁更新完了数据,别的线程同样需要进行写操作,自然锁释放后即可拿到,你又套了个读锁的意义在哪?。。。业务上有没有具体应用呢?


以上介绍了“ 在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/4533395.html

相关图片

相关文章