无论是公平锁还是非公平锁,他们的出队顺序都是有序的。
公平与非公平的真正含义是他们在加锁的时候**

进入队列之前

进入lock方法

  • 非公平锁二话不说,直接去CAS抢锁
    1. - ![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)
    2. - 如果失败才准备进入队列
  • 公平锁直接准备进入队列

    - ![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抢一次锁

    • image.png
    • CAS失败才真正进入队列
  • 公平锁会判断自己是不是第一个元素
    • 如果是第一个元素,就不进入队列(甚至不初始化队列),而是去会去CAS拿一次锁
    • image.png
    • 如果不是第一个元素,才真正进入队列,并且自己睡眠,开始排队。

公平锁与非公平锁.jpg