Class ReentrantWriterPreferenceReadWriteLock
java.lang.Object
EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock
EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock
- All Implemented Interfaces:
ReadWriteLock
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();
}
}
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class WriterPreferenceReadWriteLock
WriterPreferenceReadWriteLock.ReaderLock, WriterPreferenceReadWriteLock.Signaller, WriterPreferenceReadWriteLock.WriterLock -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final Integercache/reuse the special Integer value one to speed up readlocksprotected HashMapNumber of acquires on read lock by any reader threadprotected longNumber of acquires on write lock by activeWriter_ threadFields inherited from class WriterPreferenceReadWriteLock
activeReaders_, activeWriter_, readerLock_, waitingReaders_, waitingWriters_, writerLock_ -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected booleanOverride this method to change to reader preferenceprotected WriterPreferenceReadWriteLock.SignallerendRead()Called upon termination of a read.protected WriterPreferenceReadWriteLock.SignallerendWrite()Called upon termination of a write.protected booleanprotected boolean
-
Field Details
-
writeHolds_
protected long writeHolds_Number of acquires on write lock by activeWriter_ thread -
readers_
Number of acquires on read lock by any reader thread -
IONE
cache/reuse the special Integer value one to speed up readlocks
-
-
Constructor Details
-
ReentrantWriterPreferenceReadWriteLock
public ReentrantWriterPreferenceReadWriteLock()
-
-
Method Details
-
allowReader
protected boolean allowReader()Description copied from class:WriterPreferenceReadWriteLockOverride this method to change to reader preference- Overrides:
allowReaderin classWriterPreferenceReadWriteLock
-
startRead
protected boolean startRead()- Overrides:
startReadin classWriterPreferenceReadWriteLock
-
startWrite
protected boolean startWrite()- Overrides:
startWritein classWriterPreferenceReadWriteLock
-
endRead
Description copied from class:WriterPreferenceReadWriteLockCalled upon termination of a read. Returns the object to signal to wake up a waiter, or null if no such- Overrides:
endReadin classWriterPreferenceReadWriteLock
-
endWrite
Description copied from class:WriterPreferenceReadWriteLockCalled upon termination of a write. Returns the object to signal to wake up a waiter, or null if no such- Overrides:
endWritein classWriterPreferenceReadWriteLock
-