public class

ReentrantWriterPreferenceReadWriteLock

extends WriterPreferenceReadWriteLock
java.lang.Object
   ↳ com.microstrategy.utils.concurrent.WriterPreferenceReadWriteLock
     ↳ com.microstrategy.utils.concurrent.ReentrantWriterPreferenceReadWriteLock

Class Overview

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. ]

Summary

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
From class com.microstrategy.utils.concurrent.WriterPreferenceReadWriteLock
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
From class com.microstrategy.utils.concurrent.WriterPreferenceReadWriteLock
From class java.lang.Object
From interface com.microstrategy.utils.concurrent.ReadWriteLock

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 *

Public Constructors

public ReentrantWriterPreferenceReadWriteLock ()

Protected Methods

protected boolean allowReader ()

Override this method to change to reader preference *

protected synchronized WriterPreferenceReadWriteLock.Signaller endRead ()

Called upon termination of a read. Returns the object to signal to wake up a waiter, or null if no such

protected synchronized WriterPreferenceReadWriteLock.Signaller endWrite ()

Called upon termination of a write. Returns the object to signal to wake up a waiter, or null if no such

protected synchronized boolean startRead ()

protected synchronized boolean startWrite ()