java.util.concurrent.locks.ReadWriteLock 源码: html
package java.util.concurrent.locks; public interface ReadWriteLock { Lock readLock(); Lock writeLock(); }
全部已知实现类:
ReentrantReadWriteLock
java
ReadWriteLock 维护了一对相关的锁,一个用于只读操做,另外一个用于写入操做。只要没有 writer,读取锁 能够由多个 reader 线程同时保持。写入锁 是独占的。成功获取读锁的线程会看到写入锁以前版本所作的全部更新。api
与互斥锁相比,读-写锁 容许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer 线程)能够修改共享数据,但在许多状况下,任何数量的线程能够同时读取共享数据(reader 线程)。从理论上讲,与互斥锁相比,使用读-写锁所容许的并发性加强将带来更大的性能提升。并发
与互斥锁相比,使用读-写锁可否提高性能则取决于读写操做期间读取数据相对于修改数据的频率,以及数据的争用——即在同一时间试图对该数据执行读取或写入操做的线程数。性能
例如,某个最初用数据填充而且以后不常常对其进行修改的 collection,由于常常对其进行搜索(好比搜索某种目录),因此这样的 collection 是使用读-写锁的理想候选者。可是,若是数据更新变得频繁,数据在大部分时间都被写入锁 独占,这时,就算存在并发性加强,也是微不足道的。更进一步地说,若是读取操做所用时间过短,则读-写锁实现(它自己就比互斥锁复杂)的开销将成为主要的执行成本。最终,只有经过分析和测量,才能肯定应用程序是否适合使用读-写锁。spa
尽管读-写锁的基本操做是直截了当的,但实现仍然必须做出许多决策,这些决策可能会影响给定应用程序中读-写锁的效果。这些策略的例子包括:.net
Lock |
readLock() 返回用于读取操做的锁。 |
Lock |
writeLock() 返回用于写入操做的锁。 |
Lock readLock()
返回:
用于读取操做的锁。
线程
Lock writeLock()
返回:
用于写入操做的锁。code