公平锁 & 非公平锁
2020-08-05 14:02:45 13 举报
锁
作者其他创作
大纲/内容
state = 0
B
持有锁线程null
1,修改state为0
AQS
2,判断自己是否需要在队列中排队,队列为null不需要
公平锁加锁
非公平锁解锁
线程B
state = 1
C
3,CAS修改state值为1
1,发现state为0,CAS修改state为1
1,发现state = 0,CAS修改为1
持有锁线程A
4,发现state = 0
3,唤醒线程B
总结:1,获取锁时非公平锁会CAS设置锁的同步状态,而会公平锁多了一个判断条件hasQueuedPredecessors(),判断加入了同步队列的当前节点是否存在前驱节点,如果有,就要先唤醒前驱节点中的线程去获得锁。--------------------------------------------------------------------------------------------- 2,非公平锁相同公平锁效率更高,因为公平锁是按照队列的先进先出的顺序获取锁,代价是会有大量的线程上下文切换,非公平锁虽然会造成线程饥饿,但是线程切换少,吞吐量高
非公平锁加锁
线程A
同步队列
1,发现state为0
1,判断state是否为0
非公平锁
2,设置自己为当前持有锁的过程
1,修改state值为0
2,发现自己是队首
2,将C设置为持有锁的线程
4,继续排队
2,设置持有锁线程为null
线程C
公平锁
2,进入队列排队
4,设置自己为当前持有锁的线程
3,唤醒B线程
2,设置当前持有锁线程为null
3,把自己设置为持有锁的线程l
3,发现state为1
1,发现state为1,CAS成功则获取锁,失败进行2
5,发现自己需要在队列中排队,队列中第一位已经有元素
0 条评论
下一页