该实现的行为与 ReentrantLock.newCondition() 提供的 Condition 实现对 ReentrantLock 所做的行为相同。
当然,此 Condition 只能用于写入锁。
读取锁不支持 Condition,readLock().newCondition() 会抛出 UnsupportedOperationException。
监测
此类支持一些确定是保持锁还是争用锁的方法。这些方法设计用于监视系统状态,而不是同步控制。
此类行为的序列化方式与内置锁的相同:反序列化的锁处于解除锁状态,无论序列化该锁时其状态如何。
示例用法。下面的代码展示了如何利用重入来执行升级缓存后的锁降级(为简单起见,省略了异常处理):
*/
class CachedData {
Object data;
volatile boolean cacheva lid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheva lid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
// Recheck state because another thread might have acquired
// write lock and changed state before we did.
if (!cacheva lid) {
data = ...
cacheva lid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
rwl.writeLock().unlock(); // Unlock write, still hold read
}
use(data);
rwl.readLock().unlock();
}
}
/*在使用某些种类的 Collection 时,可以使用 ReentrantReadWriteLock 来提高并发性。
通常,在预期 collection 很大,读取者线程访问它的次数多于写入者线程,
并且 entail 操作的开销高于同步开销时,这很值得一试。
例如,以下是一个使用 TreeMap 的类,预期它很大,并且能被同时访问。 */
class RWDictionary {
private final Map
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public String[] allKeys() {
r.lock();
try {
return (String[]) m.keySet().toArray();
}finally {
r.unlock();
}
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}
/*
实现注意事项:
此锁最多支持 65535 个递归写入锁和 65535 个读取锁。试图超出这些限制将导致锁方法抛出 Error。
*/
/*
java.util.concurrent.locks
类 ReentrantReadWriteLock
java.lang.Object
java.util.concurrent.locks.ReentrantReadWriteLock
所有已实现的接口:
Serializable, ReadWriteLock
//--------------------------------------------------------------------------------
public class ReentrantReadWriteLockextends Objectimplements ReadWriteLock, Serializable支持与 ReentrantLock 类似语义的 ReadWriteLock 实现。
此类具有以下属性:
获取顺序
此类不会将读取者优先或写入者优先强加给锁访问的排序。但是,它确实支持可选的公平 策略。
非公平模式(默认)
当非公平地(默认)构造时,未指定进入读写锁的顺序,受到 reentrancy 约束的限制。
连续竞争的非公平锁可能无限期地推迟一个或多个 reader 或 writer 线程,但吞吐量通常要高于公平锁。
公平模式
当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入。
当释放当前保持的锁时,可以为等待时间最长的单个 writer 线程分配写入锁,
如果有一组等待时间大于所有正在等待的 writer 线程 的 reader 线程,将为该组分配写入锁。
如果保持写入锁,或者有一个等待的 writer 线程,则试图获得公平读取锁(非重入地)的线程将会阻塞。
直到当前最旧的等待 writ