aqs
2021-07-27 16:34:01 0 举报
aqs加锁流程
作者其他创作
大纲/内容
next
维护t2的列表关系(t2入队)
自旋一次,看能不能拿到锁
h != t返回falseh和t 为 null
tair
不是第一个排队的返回true,不能加锁
不需要排队cas加锁
false
unlock
是第一个排队的返回false,可以能加锁
队列初始化
thread = t2
把null这个node设置为aqs的头和尾
h != t为true
prev
判断锁的状态
判断自己是否需要排队
被初始化了
唤醒对象
true
队列中元素等于一
thread = null
入队
t1不在队列中持有锁的线程不在队列中
实例化一个thread为null的node的对象
t1
队列是否初始化
队列中元素大于一
thread = t3
(s = h.next) == nullfalse
s.thread != Thread.currentThread()true比较当前线程是否和第一个排队的线程不等
t2阻塞
head
t2
特殊情况因为&& 不是原子操作所以,当h != t为true时,t1刚好unlock唤醒t2,此时头结点被设置为空,aqs队列只有t2,并且执行到释放锁阶段,此时t3来了执行到这里(s = h.next) == null判断就会为true,
0 条评论
下一页