EDU.oswego.cs.dl.util.concurrent

Class ReentrantWriterPreferenceReadWriteLock

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:
ReentrantLock

Nested Class Summary

Nested classes/interfaces inherited from class EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock

WriterPreferenceReadWriteLock.ReaderLock, WriterPreferenceReadWriteLock.Signaller, WriterPreferenceReadWriteLock.WriterLock

Field Summary

protected static Integer
IONE
cache/reuse the special Integer value one to speed up readlocks *
protected HashMap
readers_
Number of acquires on read lock by any reader thread *
protected long
writeHolds_
Number of acquires on write lock by activeWriter_ thread *

Fields inherited from class EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock

activeReaders_, activeWriter_, readerLock_, waitingReaders_, waitingWriters_, writerLock_

Method Summary

protected boolean
allowReader()
protected WriterPreferenceReadWriteLock.Signaller
endRead()
protected WriterPreferenceReadWriteLock.Signaller
endWrite()
protected boolean
startRead()
protected boolean
startWrite()

Methods inherited from class EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock

allowReader, cancelledWaitingReader, cancelledWaitingWriter, endRead, endWrite, readLock, startRead, startReadFromNewReader, startReadFromWaitingReader, startWrite, startWriteFromNewWriter, startWriteFromWaitingWriter, writeLock

Field Details

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 Details

allowReader

protected boolean allowReader()
Overrides:
allowReader in interface WriterPreferenceReadWriteLock

endRead

protected WriterPreferenceReadWriteLock.Signaller endRead()
Overrides:
endRead in interface WriterPreferenceReadWriteLock

endWrite

protected WriterPreferenceReadWriteLock.Signaller endWrite()
Overrides:
endWrite in interface WriterPreferenceReadWriteLock

startRead

protected boolean startRead()
Overrides:
startRead in interface WriterPreferenceReadWriteLock

startWrite

protected boolean startWrite()
Overrides:
startWrite in interface WriterPreferenceReadWriteLock