# 一、AQS(AbstractQueuedSynchronizer) 当获得锁的线程需要等待某个条件时,会进入 condition 的等待队列,等待队列可以有多个。 当 condition 条件满足时,线程会从等待队列重新进入同步队列进行获取锁的竞争。 ReentrantLock 就是基于 AQS 实现的,如下图所示,ReentrantLock 内部有公平锁和⾮公平锁两种实 现,差别就在于新来的线程是否⽐已经在同步队列中的等待线程更早获得锁。 和 ReentrantLock 实现⽅式类似,Semaphore 也是基于 AQS 的,差别在于 ReentrantLock 是独占锁, Semaphore 是共享锁。 ReentrantLockn里面有一个内部类Sync,Sync继承 AQS(AbstractQueuedSynchronizer),添加锁和释放锁的⼤部分操作实际上都是在Sync中实现的。 它有公平锁FairSync和非公平锁NonfairSync两个子类。 ReentrantLock默认使用非公平锁,也可以通过构造器来显示的指定使用公平锁。
二、过程
1.非公平锁过程
线程A准备获取锁,发现state为0,cas成功将线程锁改为A,线程B进入时,state为1cas失败,进入等待队列。
线程A将锁释放,通知等待队列线程B获取锁,此时线程c进入发现state为0将所锁线程改为线程C,线程CAS失败继续等待。
2.公平锁过程
默认非公平锁 构造器传入参数
ReentrantLock lock = new ReentrantLock(true);
线程A获取锁发现state为0,cas成功将线程锁改为A,线程B进入时,state为1cas失败,进入等待队列。
线程A将锁释放,通知等待队列线程B获取锁,此时线程c进入发现state为0,且等待队列存在线程,进行队列排序。
线程B队列顺序为0且state为0,线程B获得锁