分类

通过构造方法决定内部引用是公平锁还是非公平锁

公平锁

通过tryAcquire方法查看当前锁的状态标志位和当前锁的持有线程对象。当为未持有状态时,查看是否有正在排队的node对象。如果没有并且通过CAS成功将状态标志位修改,那么将持有锁的线程对象改为当前线程(#1)。如果在上一步发现有node正在处理,那么将当前线程打包为node对象,添加到队列中(#2),再次尝试去拿锁,如果失败,那么将进入阻塞状态,并进入自旋状态等待唤醒(#3),

1
image.png

2
image.png

3
image.png

非公平锁

这种模式下,不会去队列查看是否前面有node正在等待,直接尝试CAS修改状态标志位。如果失败则进入acquire方法(#1),在里面二次尝试拿锁(#2),排队与加入队列与公平锁一致

1
image.png

2
image.png