什么是ReentrantReadWriteLock的升级/降级?

卢声远*_* Lu 8 java concurrency locking upgrade

什么是升级/降级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();
   }
 }
Run Code Online (Sandbox Code Playgroud)

我知道它讨论了readLock和writeLock之间的关系,但我无法从doc获得清晰的概念.你能给我一点解释吗?谢谢!

tem*_*def 13

我相信在这种情况下,"升级"和"降级"的想法是基于这样一种观点,即读者锁在某种意义上是比作家锁更"弱"的锁.当获取写入锁定时,没有其他线程可以以任何形式获取锁定,而使用读取器锁定任何其他线程都可以获取读取锁定.

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

但是,另一种方法不起作用 - 一旦你持有读锁定,就不能通过尝试获取写锁来"升级"为保持更重要的写锁定.如果您尝试这样做,线程将阻塞直到它被中断.

希望这可以帮助!