首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是ReentrantReadWriteLock的升级/降级?

什么是ReentrantReadWriteLock的升级/降级?
EN

Stack Overflow用户
提问于 2011-02-21 05:17:23
回答 1查看 4.3K关注 0票数 8

什么是ReentrantReadWriteLock的升级/降级?我看到javadoc关于升级/降级:

锁定降级:可重入性还允许将写入锁降级为读锁,方法是获取写锁,然后读取锁,然后释放写锁。然而,从读锁升级到写锁是不可能的。

并提供了一个样本:

代码语言:javascript
复制
class CachedData {
   Object data;
   volatile boolean cacheValid;
   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // upgrade lock manually
        rwl.readLock().unlock();   // must unlock first to obtain writelock
        rwl.writeLock().lock();
        if (!cacheValid) { // recheck
          data = ...
          cacheValid = true;
        }
        // downgrade lock
        rwl.readLock().lock();  // reacquire read without giving up write lock
        rwl.writeLock().unlock(); // unlock write, still hold read
     }

     use(data);
     rwl.readLock().unlock();
   }
 }

我知道它谈到了readLock和writeLock之间的关系,但我无法从文档中获得明确的概念。你能再给我解释一下吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-21 05:25:54

我认为,在这种情况下,“升级”和“降级”的想法是基于读者锁在某种意义上是一个“较弱”的锁比作家锁。当获得写锁时,没有其他线程可以以任何形式获取该锁,而使用读取器锁,任何其他线程都可以获得读锁(如果需要的话)。

在这里,“降级”锁意味着,如果您持有写锁,您可以切换到只持有读锁,通过获取读锁,然后释放写锁。这意味着您可以让一个线程开始做一些非常重要的事情(这会阻止其他线程读取),完成它的工作,然后切换到优先级较低的锁(读锁),而不会没有锁。这使您可以连续持有锁,而不被抢占。

然而,另一种方法不起作用--一旦你持有读锁,你就不能通过尝试获取写锁来“升级”到持有更重要的写锁。如果您尝试这样做,线程只会阻塞直到被中断。

希望这能有所帮助!

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5062594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档