接口: ReadWriteLockspa
接口定义的方法就是:readLock()和writeLock();.net
接口源码:线程
public interface ReadWriteLock {
/**
* Returns the lock used for reading.
*
* @return the lock used for reading.
*/
Lock readLock();递归
/**
* Returns the lock used for writing.
*
* @return the lock used for writing.
*/
Lock writeLock();
}接口
它的实现类是:ReentrantReadWriteLock.队列
ReentrantReadWriteLock的特性:get
- 公平性
- 非公平锁(默认) 这个和独占锁的非公平性同样,因为读线程之间没有锁竞争,因此读操做没有公平性和非公平性,写操做时,因为写操做可能当即获取到锁,因此会推迟一个或多个读操做或者写操做。所以非公平锁的吞吐量要高于公平锁。
- 公平锁 利用AQS的CLH队列,释放当前保持的锁(读锁或者写锁)时,优先为等待时间最长的那个写线程分配写入锁,当前前提是写线程的等待时间要比全部读线程的等待时间要长。一样一个线程持有写入锁或者有一个写线程已经在等待了,那么试图获取公平锁的(非重入)全部线程(包括读写线程)都将被阻塞,直到最早的写线程释放锁。若是读线程的等待时间比写线程的等待时间还有长,那么一旦上一个写线程释放锁,这一组读线程将获取锁。
- 重入性
- 读写锁容许读线程和写线程按照请求锁的顺序从新获取读取锁或者写入锁。固然了只有写线程释放了锁,读线程才能获取重入锁。
- 写线程获取写入锁后能够再次获取读取锁,可是读线程获取读取锁后却不能获取写入锁。
- 另外读写锁最多支持65535个递归写入锁和65535个递归读取锁。
- 锁降级
- 写线程获取写入锁后能够获取读取锁,而后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性。
- 锁升级
- 读取锁是不能直接升级为写入锁的。由于获取一个写入锁须要释放全部读取锁,因此若是有两个读取锁视图获取写入锁而都不释放读取锁时就会发生死锁。
- 锁获取中断
- 读取锁和写入锁都支持获取锁期间被中断。这个和独占锁一致。
- 条件变量
- 写入锁提供了条件变量(Condition)的支持,这个和独占锁一致,可是读取锁却不容许获取条件变量,将获得一个UnsupportedOperationException异常。
- 重入数
- 读取锁和写入锁的数量最大分别只能是65535(包括重入数)。