EDU.oswego.cs.dl.util.concurrent

Class ReentrantWriterPreferenceReadWriteLock

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:

Field Summary
protected static IntegerIONE
cache/reuse the special Integer value one to speed up readlocks *
protected HashMapreaders_
Number of acquires on read lock by any reader thread *
protected longwriteHolds_
Number of acquires on write lock by activeWriter_ thread *
Method Summary
protected booleanallowReader()
protected SignallerendRead()
protected SignallerendWrite()
protected booleanstartRead()
protected booleanstartWrite()

Field Detail

IONE

protected static final Integer IONE
cache/reuse the special Integer value one to speed up readlocks *

readers_

protected HashMap readers_
Number of acquires on read lock by any reader thread *

writeHolds_

protected long writeHolds_
Number of acquires on write lock by activeWriter_ thread *

Method Detail

allowReader

protected boolean allowReader()

endRead

protected Signaller endRead()

endWrite

protected Signaller endWrite()

startRead

protected boolean startRead()

startWrite

protected boolean startWrite()