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

“锁定降级:
重入还可以通过获取写锁,然后读锁和释放写锁的方式,从写锁降级为读锁。但是,无法从读取锁定升级到写入锁定。”

并提供了一个示例:

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之间的关系,但是我无法从文档中获得清晰的概念。您能再给我一点解释吗?谢谢!

最佳答案

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

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

但是,另一种方法不起作用-持有读取锁后,就无法通过尝试获取写入锁来“升级”至持有更重要的写入锁。如果您尝试执行此操作,则线程将一直阻塞直到被中断。

希望这可以帮助!

10-06 03:45