- ReentrantLock
- 介绍(与synchronized的区别)
- 使用方式
- 源码
- NonfairSync 和 FairSync
- AbstractQueuedSynchronizer(AQS)
- 源码
8.1 ReentrantLock
(1)介绍(与synchronized的区别):除了synchronized之外的另一种独占锁
- 从底层出发
- synchronized基于jvm级别,因为加重量级锁时它会涉及到C++的Monitor对象
- 而ReentrantLock属于API级别
- 从性能出发
- synchronized优化(引入偏向锁,自旋)之后,两者性能差不多,官方甚至建议使用synchronized
- ReentrantLock粒度更小
- 从设计者出发
- synchronized更多的是悲观锁思想,自旋优化引入了点CAS乐观锁思想
- ReentrantLock主要是乐观锁思想: 自旋 + park() + CAS
- 从API层面出发:ReentrantLock的设计灵活性更强,有五大特点
- 1. 独占锁:synchronized也是
- 2. 可重入锁:synchronized也是
- 3. 公平/非公平锁:ReentrantLock默认非公平;synchronized只支持非公平
- 4. 响应中断:阻塞时可以被打断,synchronized不行
- 5. 支持绑定多个Condition:synchronized不行
(2)使用方式API
(3)源码
AQS相关 |
|
|
|
|
|
|
|
|
构造器 |
|
|
|
|
|
加锁解锁 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
其他方法 |
|
|
(4)NonfairSync 和 FairSync
- 具体讲一下NonfairSync的lock()方法:
- 如果是非公平锁,新来加锁的线程它会先进行一次CAS(并不会公平排队,进入队列),万一另一线程正好释放了锁,该线程就拿到了锁。不公平体现在这里
-
static final class NonfairSync extends Sync { final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } }
8.2 AbstractQueuedSynchronizer(AQS)
- 介绍:
- 几个重要的属性
- state属性:表示资源的状态
-
//volatile保证可见性 private volatile int state; //state的相关方法 //1. getState:获取state状态; //2. setState:设置state状态; //3. compareAndSetState:CAS设置state状态
- 例子:
- ReentrantLock:当前线程获得锁的可重入次数(=0表示可以获得锁,>0表示锁已被占用,需要判断是否是自身锁)
- ReentrantReadWriteLock:state高16位表示读状态(获取读锁的次数),低16位表示获取写锁的线程可重入次数
- semaphore:state表示当前可用信号的个数
- CountDownlatch:state表示计数器当前的值
-
- Node内部类
- 1
- state属性:表示资源的状态
- Reference: