java.lang.Object | ||
↳ | com.microstrategy.utils.concurrent.WriterPreferenceReadWriteLock | |
↳ | com.microstrategy.utils.concurrent.ReentrantWriterPreferenceReadWriteLock |
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(); } }
Fields | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
protected static final 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 * |
[Expand]
Inherited Fields | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ReentrantWriterPreferenceReadWriteLock() |
Protected Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
boolean |
allowReader()
Override this method to change to reader preference *
| ||||||||||
synchronized WriterPreferenceReadWriteLock.Signaller |
endRead()
Called upon termination of a read.
| ||||||||||
synchronized WriterPreferenceReadWriteLock.Signaller |
endWrite()
Called upon termination of a write.
| ||||||||||
synchronized boolean | startRead() | ||||||||||
synchronized boolean | startWrite() |
[Expand]
Inherited Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() | |||||||||||
![]() | |||||||||||
![]() |
cache/reuse the special Integer value one to speed up readlocks *
Number of acquires on read lock by any reader thread *
Number of acquires on write lock by activeWriter_ thread *
Override this method to change to reader preference *
Called upon termination of a read. Returns the object to signal to wake up a waiter, or null if no such
Called upon termination of a write. Returns the object to signal to wake up a waiter, or null if no such