java.util.concurrent.locks
Class ReentrantReadWriteLock

java.lang.Object
  extended by java.util.concurrent.locks.ReentrantReadWriteLock
All Implemented Interfaces:
ReadWriteLock, Serializable

public class ReentrantReadWriteLock
extends Object
implements ReadWriteLock, Serializable

An implementation of ReadWriteLock supporting similar semantics to ReentrantLock.

This class has the following properties:

Sample usage. Here is a code sketch showing how to exploit reentrancy to perform lock downgrading after updating a cache (exception handling is elided for simplicity):

 class CachedData {
   Object data;
   volatile boolean cacheValid;
   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // upgrade lock manually
        rwl.readLock().unlock();   // must unlock first to obtain writelock
        rwl.writeLock().lock();
        if (!cacheValid) { // recheck
          data = ...
          cacheValid = true;
        }
        // downgrade lock
        rwl.readLock().lock();  // reacquire read without giving up write lock
        rwl.writeLock().unlock(); // unlock write, still hold read
     }

     use(data);
     rwl.readLock().unlock();
   }
 }
 

Implementation Considerations

In addition to the above, this reference implementation has the following property:

Since:
1.5
See Also:
Serialized Form

Nested Class Summary
static class ReentrantReadWriteLock.WriterConditionObject
          Condition implementation for use with ReentrantReadWriteLock.
 
Constructor Summary
ReentrantReadWriteLock()
          Creates a new ReentrantReadWriteLock with default ordering properties.
ReentrantReadWriteLock(boolean fair)
          Creates a new ReentrantReadWriteLock with the given fairness policy.
 
Method Summary
protected  Collection<Thread> getQueuedReaderThreads()
          Returns a collection containing threads that may be waiting to acquire the read lock.
protected  Collection<Thread> getQueuedThreads()
          Returns a collection containing threads that may be waiting to acquire this lock.
protected  Collection<Thread> getQueuedWriterThreads()
          Returns a collection containing threads that may be waiting to acquire the write lock.
 int getQueueLength()
          Returns an estimate of the number of threads waiting to acquire this lock.
 int getReadLocks()
          Queries the number of read locks held for this lock.
 int getWriteHoldCount()
          Queries the number of reentrant write holds on this lock by the current thread.
protected  Thread getWriter()
          Returns the thread that currently owns the write lock, or null if not owned.
 boolean isFair()
          Return true if this lock has fairness set true.
 boolean isWriteLocked()
          Queries if the write lock is held by any thread.
 boolean isWriteLockedByCurrentThread()
          Queries if the write lock is held by the current thread.
 Lock readLock()
          Return the lock used for reading.
 Lock writeLock()
          Return the lock used for writing.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ReentrantReadWriteLock

public ReentrantReadWriteLock()
Creates a new ReentrantReadWriteLock with default ordering properties.


ReentrantReadWriteLock

public ReentrantReadWriteLock(boolean fair)
Creates a new ReentrantReadWriteLock with the given fairness policy.

Parameters:
fair - true if this lock should use a fair ordering policy
Method Detail

writeLock

public Lock writeLock()
Description copied from interface: ReadWriteLock
Return the lock used for writing.

Specified by:
writeLock in interface ReadWriteLock

readLock

public Lock readLock()
Description copied from interface: ReadWriteLock
Return the lock used for reading.

Specified by:
readLock in interface ReadWriteLock

isFair

public boolean isFair()
Return true if this lock has fairness set true.

Returns:
true if this lock has fairness set true.

getReadLocks

public int getReadLocks()
Queries the number of read locks held for this lock. This method is designed for use in monitoring of the system state, not for synchronization control.

Returns:
the number of read locks held.

isWriteLocked

public boolean isWriteLocked()
Queries if the write lock is held by any thread. This method is designed for use in monitoring of the system state, not for synchronization control.

Returns:
true if any thread holds write lock and false otherwise.

isWriteLockedByCurrentThread

public boolean isWriteLockedByCurrentThread()
Queries if the write lock is held by the current thread.

Returns:
true if current thread holds this lock and false otherwise.

getWriteHoldCount

public int getWriteHoldCount()
Queries the number of reentrant write holds on this lock by the current thread.

A writer thread has a hold on a lock for each lock action that is not matched by an unlock action.

Returns:
the number of holds on this lock by the current thread, or zero if this lock is not held by the current thread.

getQueueLength

public int getQueueLength()
Returns an estimate of the number of threads waiting to acquire this lock. The value is only an estimate because the number of threads may change dynamically while this method traverses internal data structures. This method is designed for use in monitoring of the system state, not for synchronization control.

Returns:
the estimated number of threads waiting for this lock

getWriter

protected Thread getWriter()
Returns the thread that currently owns the write lock, or null if not owned. Note that the owner may be momentarily null even if there are threads trying to acquire the lock but have not yet done so. This method is designed to facilitate construction of subclasses that provide more extensive lock monitoring facilities.

Returns:
the owner, or null if not owned.

getQueuedThreads

protected Collection<Thread> getQueuedThreads()
Returns a collection containing threads that may be waiting to acquire this lock. Because the actual set of threads may change dynamically while constructing this result, the returned collection is only a best-effort estimate. The elements of the returned collection are in no particular order. This method is designed to facilitate construction of subclasses that provide more extensive lock monitoring facilities.

Returns:
the collection of threads

getQueuedWriterThreads

protected Collection<Thread> getQueuedWriterThreads()
Returns a collection containing threads that may be waiting to acquire the write lock. Because the actual set of threads may change dynamically while constructing this result, the returned collection is only a best-effort estimate. The elements of the returned collection are in no particular order. This method is designed to facilitate construction of subclasses that provide more extensive lock monitoring facilities.

Returns:
the collection of threads

getQueuedReaderThreads

protected Collection<Thread> getQueuedReaderThreads()
Returns a collection containing threads that may be waiting to acquire the read lock. Because the actual set of threads may change dynamically while constructing this result, the returned collection is only a best-effort estimate. The elements of the returned collection are in no particular order. This method is designed to facilitate construction of subclasses that provide more extensive lock monitoring facilities.

Returns:
the collection of threads