Class ReentrantWriterPreferenceReadWriteLock

java.lang.Object
org.castor.core.util.concurrent.WriterPreferenceReadWriteLock
org.castor.core.util.concurrent.ReentrantWriterPreferenceReadWriteLock
All Implemented Interfaces:
ReadWriteLock

public class ReentrantWriterPreferenceReadWriteLock extends WriterPreferenceReadWriteLock
A writer-preference ReadWriteLock that allows both readers and writers to reacquire read or write locks in the style of a ReentrantLock. Readers are not allowed until all write locks held by the writing thread have been released. Among other applications, reentrancy can be useful when write locks are held during calls or callbacks to methods that perform reads under read locks.

Sample usage . Here is a code sketch showing how to exploit reentrancy to perform lock downgrading after updating a cache:


  class CachedData {
    Object data;
    volatile boolean cacheValid;
    ReentrantWriterPreferenceReadWriteLock rwl = ...

    void processCachedData() {
      rwl.readLock().acquire();
      if (!cacheValid) {

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

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

 

[ Introduction to this package. ]

See Also:
  • "java.util.concurrent.locks.ReentrantLock in Java 5 or later JavaDoc"