public class ReentrantReadWriteLock extends WriterPreferenceReadWriteLock
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();
}
}
ReentrantLockWriterPreferenceReadWriteLock.ReaderLock, WriterPreferenceReadWriteLock.Signaller, WriterPreferenceReadWriteLock.WriterLock| Modifier and Type | Field | Description |
|---|---|---|
protected static java.lang.Integer |
IONE |
cache/reuse the special Integer value one to speed up readlocks
|
protected java.util.HashMap |
readers_ |
Number of acquires on read lock by any reader thread
|
protected long |
writeHolds_ |
Number of acquires on write lock by activeWriter_ thread
|
activeReaders_, activeWriter_, readerLock_, waitingReaders_, waitingWriters_, writerLock_| Constructor | Description |
|---|---|
ReentrantReadWriteLock() |
| Modifier and Type | Method | Description |
|---|---|---|
protected boolean |
allowReader() |
Override this method to change to reader preference
|
protected WriterPreferenceReadWriteLock.Signaller |
endRead() |
Called upon termination of a read.
|
protected WriterPreferenceReadWriteLock.Signaller |
endWrite() |
Called upon termination of a write.
|
protected boolean |
startRead() |
|
protected boolean |
startWrite() |
cancelledWaitingReader, cancelledWaitingWriter, readLock, startReadFromNewReader, startReadFromWaitingReader, startWriteFromNewWriter, startWriteFromWaitingWriter, writeLockprotected long writeHolds_
protected java.util.HashMap readers_
protected static final java.lang.Integer IONE
protected boolean allowReader()
WriterPreferenceReadWriteLockallowReader in class WriterPreferenceReadWriteLockprotected boolean startRead()
startRead in class WriterPreferenceReadWriteLockprotected boolean startWrite()
startWrite in class WriterPreferenceReadWriteLockprotected WriterPreferenceReadWriteLock.Signaller endRead()
WriterPreferenceReadWriteLockendRead in class WriterPreferenceReadWriteLockprotected WriterPreferenceReadWriteLock.Signaller endWrite()
WriterPreferenceReadWriteLockendWrite in class WriterPreferenceReadWriteLockCopyright © 2005 - 2009 Javolution.