aqs
2020-07-06 23:25:44 0 举报
AQS流程
作者其他创作
大纲/内容
prev
Node-2
thread-runing
Node-1
next
thread-blocker
waitStatus = 0
head
waitStatus = -1
tail
Node-2里的线程被阻塞住,暂不会继续执行
这一步,Node-1的waitStauts被修改
1:某一个线程获取到锁;被执行方法:* tryAcquire(int arg);
AQS
2:一个新的线程进来了,首先尝试获取锁,但是失败了,然后被包装成Node进入了同步队列;被执行方法:* tryAcquire(int arg);* addWaiter(Node.EXCLUSIVE) 这是个线程安全的操作,内部通过CAS加死循环解决谁排最后面
Node-3
可以发现一个规律,每新增一个节点到同步队列中:1:若前置节点不是head节点,那么至少会循环两次,第一次是给前置节点的waitStauts标示为:SIGNAL(标志为SIGNAL和解锁相关),第二次是将当前节点中的线程阻塞住;2:若前置节点是head节点,那么最少循环一次,可能第二次循环的时候,因为锁已经被释放掉了,然后执行tryAcquire让当前节点获取到了锁
0 条评论
下一页
为你推荐
查看更多