说下对 ReentrantReadWriteLock 的理解?

ReentrantReadWriteLock 允许多个读线程同时访问,但是不允许写线程和读线程、写线程和写线程同时访问。读写锁内部维护了两个锁:一个是用于读操作的 ReadLock,一个是用于写操作的 WriteLock。读写锁 ReentrantReadWriteLock 可以保证多个线程可以同时读,所以在读操作远大于写操作的时候,读写锁就非常有用了。

ReentrantReadWriteLock 基于 AQS 实现,它的自定义同步器(继承 AQS)需要在同步状态 state 上维护多个读线程和一个写线程,该状态的设计成为实现读写锁的关键。ReentrantReadWriteLock 很好的利用了高低位。来实现一个整型控制两种状态的功能,读写锁将变量切分成了两个部分,高 16 位表示读,低 16 位表示写。

  • ReentrantReadWriteLock 的特点:

1、写锁可以降级为读锁,但是读锁不能升级为写锁;

2、 不管是 ReadLock 还是 WriteLock 都支持 Interrupt,语义与 ReentrantLock 一致;

3、WriteLock 支持 Condition 并且与 ReentrantLock 语义一致,而 ReadLock 则不能使用 Condition,否则抛出 UnsupportedOperationException 异常;

4、 默认构造方法为非公平模式 ,开发者也可以通过指定 fair 为 true 设置为公平模式 。

  • 升降级

1、 读锁里面加写锁,会导致死锁;

\2. 写锁里面是可以加读锁的,这就是锁的降级。

发表评论