解释
AQS分析
官网解释
先进先出等待队列 state状态来记录锁的占用和释放
CLH队列是一个单向链表
AQS是采用了CLH队列的思想,在上面做了改进是虚拟的双向队列
和AQS有关的类
ReentrantLock
CountDownLatch
ReentrantReadWriteLock 读写锁
Semaphore
有阻塞必然要排队
源码
每一个请求线程都会被封装进Node,是一个内部类
源码说明
state:0空闲状态,1是争抢状态
AQS同步队列的基本结构
AQS内部体系架构
Node内部类
predecessor():获取前面节点状态
属性说明
AQS源码分析
以ReentrantLock为例
有参构造
无参构造
lock底层其实操作的是sync对象的lock方法
默认调用的是非公平的lock方法
非公平lock的落地实现
1.这里cas来判断,期望是0空闲,抢成功改成1
2.设置当前独占的线程为自己
抢到直接就用了
否则
调用acquire方法,再去排队
公平lock的落地实现
直接acquire(1);
钩子方法:
实现类:
获取状态标志位 0空闲 1占用
判断前面有没有排队的线程
返回true说明前面有一个排队的线程,返回false,当前队列是个空队列或者排第一个。
小结
加入到等待队列
非公平锁源码解读
非公平:
调用lock
调用acquire
调用tryAcquire
调用nonfairTryAcquire
非公平没有hasQueuedPredecessors()方法
公平:
调用lock
调用acquire
调用tryAcquire
公平才有hasQueuedPredecessors()方法