ReentrantLock非公平锁加锁
2021-06-24 17:10:20 0 举报
ReentrantLock非公平锁加锁流程
作者其他创作
大纲/内容
为NULL
是
等于0
tail
失败
prev
state=0?
head
NodeThread=线程对象waitStatus=0
不是
没有成功
加锁成功
不为NULL
cas是否成功,加锁是否成功?
cas修改state成功?
成功
next
在非公平锁的情况下,有可能state被其他线程提前改了
NodeThread=nullwaitStatus=0
本线程Node需要修改前一个Node的waitStatus为-1,表示前一个节点释放锁后要unpark本线程Node
不等于0
cas直接将当前线程Node添加到队尾
如果当前线程Node是队列的第一个线程Node?
入队成功
不成功
线程Node入队之后能否获取到锁?
cas成功?
初始化队列,构造一个线程为空的Node对象,作为队列的头尾节点
持有锁的线程是本线程?
队列
开始入队
自旋入队
非公平锁,不管目前是什么情况,上来就先加锁,而公平锁会先判断state是否0,为0的情况下才会去加锁,如果为0为,会判断是否需要排队
当前线程park
线程加锁时,但队列中已经有线程在排队了,当前线程就可能会park
当前队列尾节点是否为NULL,也就是队列是否为空?
直接cas修改state
非公平锁加锁
0 条评论
下一页