AQS
2020-08-10 10:57:20 0 举报
AQS
作者其他创作
大纲/内容
true
cas(0,1)state
相同
构造当前线程所在的Node
false
设置持有锁的线程为当前线程
state+1
返回false
将头结点的属性设为null,并且返回false
如果为0
如果是头结点,
永远为new Node()
pre
head
Thread = t2
tryAcquire
判断当前持有锁的线程是否是当前线程
否
next
tail
是null
给当前线程加上Interrupt标志
进入for(;;)
是
返回true
判断头结点的next是否为null || 头节点的next对应的线程是否不是当前线程
Thread = null
不是头结点
判断tail是否为null
acquire(1)
调用LocalSupport.park
尝试入队
Thread = t1
不同
获取当前线程的node的前去节点,判断是否是头节点
获取AQS的state
尝试获取锁
不是null
for(;;)首先(第一次循环)初始化队列,将head和tail都设为new Node。其次(第二次循环)将当前线程对应的node添加到队尾,维护pre
Thread = t3
成功获取锁
判断头节点和尾节点是否相同
将当前线程对应的node置为队尾
收藏
收藏
0 条评论
下一页