org.logicalcobwebs.concurrent
Class WriterPreferenceReadWriteLock

java.lang.Object
  extended by org.logicalcobwebs.concurrent.WriterPreferenceReadWriteLock
All Implemented Interfaces:
ReadWriteLock
Direct Known Subclasses:
ReaderPreferenceReadWriteLock

public class WriterPreferenceReadWriteLock
extends java.lang.Object
implements ReadWriteLock

A ReadWriteLock that prefers waiting writers over waiting readers when there is contention. This class is adapted from the versions described in CPJ, improving on the ones there a bit by segregating reader and writer wait queues, which is typically more efficient.

The locks are NOT reentrant. In particular, even though it may appear to usually work OK, a thread holding a read lock should not attempt to re-acquire it. Doing so risks lockouts when there are also waiting writers.

[ Introduction to this package. ]


Nested Class Summary
protected  class WriterPreferenceReadWriteLock.ReaderLock
           
protected  class WriterPreferenceReadWriteLock.Signaller
          Reader and Writer requests are maintained in two different wait sets, by two different objects.
protected  class WriterPreferenceReadWriteLock.WriterLock
           
 
Field Summary
protected  long activeReaders_
           
protected  java.lang.Thread activeWriter_
           
protected  WriterPreferenceReadWriteLock.ReaderLock readerLock_
           
protected  long waitingReaders_
           
protected  long waitingWriters_
           
protected  WriterPreferenceReadWriteLock.WriterLock writerLock_
           
 
Constructor Summary
WriterPreferenceReadWriteLock()
           
 
Method Summary
protected  boolean allowReader()
          Override this method to change to reader preference
protected  void cancelledWaitingReader()
           
protected  void cancelledWaitingWriter()
           
protected  WriterPreferenceReadWriteLock.Signaller endRead()
          Called upon termination of a read.
protected  WriterPreferenceReadWriteLock.Signaller endWrite()
          Called upon termination of a write.
 Sync readLock()
          get the readLock
protected  boolean startRead()
           
protected  boolean startReadFromNewReader()
           
protected  boolean startReadFromWaitingReader()
           
protected  boolean startWrite()
           
protected  boolean startWriteFromNewWriter()
           
protected  boolean startWriteFromWaitingWriter()
           
 Sync writeLock()
          get the writeLock
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

activeReaders_

protected long activeReaders_

activeWriter_

protected java.lang.Thread activeWriter_

waitingReaders_

protected long waitingReaders_

waitingWriters_

protected long waitingWriters_

readerLock_

protected final WriterPreferenceReadWriteLock.ReaderLock readerLock_

writerLock_

protected final WriterPreferenceReadWriteLock.WriterLock writerLock_
Constructor Detail

WriterPreferenceReadWriteLock

public WriterPreferenceReadWriteLock()
Method Detail

writeLock

public Sync writeLock()
Description copied from interface: ReadWriteLock
get the writeLock

Specified by:
writeLock in interface ReadWriteLock

readLock

public Sync readLock()
Description copied from interface: ReadWriteLock
get the readLock

Specified by:
readLock in interface ReadWriteLock

cancelledWaitingReader

protected void cancelledWaitingReader()

cancelledWaitingWriter

protected void cancelledWaitingWriter()

allowReader

protected boolean allowReader()
Override this method to change to reader preference


startRead

protected boolean startRead()

startWrite

protected boolean startWrite()

startReadFromNewReader

protected boolean startReadFromNewReader()

startWriteFromNewWriter

protected boolean startWriteFromNewWriter()

startReadFromWaitingReader

protected boolean startReadFromWaitingReader()

startWriteFromWaitingWriter

protected boolean startWriteFromWaitingWriter()

endRead

protected WriterPreferenceReadWriteLock.Signaller endRead()
Called upon termination of a read. Returns the object to signal to wake up a waiter, or null if no such


endWrite

protected WriterPreferenceReadWriteLock.Signaller endWrite()
Called upon termination of a write. Returns the object to signal to wake up a waiter, or null if no such