无论是公平锁还是非公平锁,他们的出队顺序都是有序的。
公平与非公平的真正含义是他们在加锁的时候**
进入队列之前
进入lock方法
- 非公平锁二话不说,直接去CAS抢锁
- ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1405454/1610817969686-1c75ffe7-cb0d-459d-bfbc-936a55199902.png#height=103&id=ugzGh&margin=%5Bobject%20Object%5D&name=image.png&originHeight=332&originWidth=1312&originalType=binary&size=53453&status=done&style=none&width=407)
- 如果失败才准备进入队列
公平锁直接准备进入队列
- ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1405454/1610818223407-bcb96bb0-7592-4fc1-b8f2-07666c9ce4d0.png#height=124&id=xPgzm&margin=%5Bobject%20Object%5D&name=image.png&originHeight=264&originWidth=784&originalType=binary&size=25437&status=done&style=none&width=368)
准备进入队列流程
真正进入队列之前
准备进入队列,在真正进入队列之前,它们都会不死心,
getState() 判断一下锁是否仍然被别的线程持有,如果没有人持有非公平锁会再去CAS抢一次锁
- CAS失败才真正进入队列
- 公平锁会判断自己是不是第一个元素
- 如果是第一个元素,就不进入队列(甚至不初始化队列),而是去会去CAS拿一次锁
- 如果不是第一个元素,才真正进入队列,并且自己睡眠,开始排队。