/*
* File: ReadWriteLock.java Originally written by Doug Lea and released into the
* public domain. This may be used for any purposes whatsoever without
* acknowledgment. Thanks for the assistance and support of Sun Microsystems
* Labs, and everyone contributing, testing, and using this code. History: Date
* Who What 11Jun1998 dl Create public version
*/
package org.castor.core.util.concurrent;
/**
* ReadWriteLocks maintain a pair of associated locks. The readLock may be held
* simultanously by multiple reader threads, so long as there are no writers.
* The writeLock is exclusive. ReadWrite locks are generally preferable to plain
* Sync locks or synchronized methods in cases where:
* <ul>
* <li>The methods in a class can be cleanly separated into those that only
* access (read) data vs those that modify (write).
* <li>Target applications generally have more readers than writers.
* <li>The methods are relatively time-consuming (as a rough rule of thumb,
* exceed more than a hundred instructions), so it pays to introduce a bit more
* overhead associated with ReadWrite locks compared to simple synchronized
* methods etc in order to allow concurrency among reader threads.
* </ul>
* Different implementation classes differ in policies surrounding which threads
* to prefer when there is contention. By far, the most commonly useful policy
* is WriterPreferenceReadWriteLock. The other implementations are targeted for
* less common, niche applications.
* <p>
* Standard usage:
*
* <pre>
* class X {
* ReadWriteLock rw;
*
* // ...
*
* public void read() throws InterruptedException {
* rw.readLock().acquire();
* try {
* // ... do the read
* }
* finally {
* rw.readlock().release()
* }
* }public void write() throws InterruptedException {
* rw.writeLock().acquire();
* try {
* // ... do the write
* }
* finally {
* rw.writelock().release()
* }
* }}
* </pre>
*
* @see Sync
* <p>[ <a
* href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html">
* Introduction to this package. </a>]
*/
public interface ReadWriteLock {
/** get the readLock * */
Sync readLock();
/** get the writeLock * */
Sync writeLock();
}