带着问题看源码
公平锁和非公平锁如何实现
锁竞争,入队操作
释放锁,出队操作
公平锁和非公平锁
在ReentrantLock内部,实现了FairSync和NonfairSync两个内部类,这两个类都继承了抽象类Sync,Sync又继承了AQS抽象类。
默认为非公平锁
非公平锁lock操作流程
线程1
进入lock()方法时,先进行一次CAS,因为当前无其他线程进入,所以CAS成功,state值设为1,同时设置 exclusiveOwnerThread = 线程1
当前状态
state=1
exclusiveOwnerThread = 线程1
线程2
进入lock()方法,先进行一次CAS看是否能争夺到锁,此时state=1,进入acquire()方法,此方法主要是再次取锁 和构建 双项链表,存入等待线程。
acquire方法
tryAcquire详解
我们这里对非公平锁进行详解
addWaiter详解
这个方法主要是构建Node节点,首次入参传递的null
Node类
关注这4个属性,线程,前节点,后节点,等待状态。
先构建一个Node节点进去enq方法
循环创建节点,这个for循环 创建双项节点的思路妙!
最终构建的节点结构,为什么头节点的thread是null ,我们可以理解为 头节点为获取到锁的线程,后面的都是等待线程。
acquireQueued方法详解
线程1解锁
线程2获得锁