AQS流程图
2022-05-14 20:32:12 3 举报
AQS
作者其他创作
大纲/内容
node0
waitstatus
node1
next
1.当node0获取到锁后,将thread的引用置为null,因为引用的线程已经开始执行2.新入队的node节点会采用for(; ; )和cas的方式将prev节点的waitstatus置为-1,如下代码执行情况截图:
exclusiveOwnerThread属性存放当前执行线程
state = 0
node2
t0
thread
tail
thread = t1
AbstractQueuedSynchronizer
next= null
prev = null
1.首先初始化CLH队列时,会创建一个空的node节点,作为对立的头节点,并且head和tail同时执行这个new node()的节点2.当有新的线程需要排队时,保证成node节点进入队列,首先将头节点的waitstatus置为 -1 ,说明下一个节点可以被唤醒。3.当一只有新的node进入队列时,队列最终会成为一个双向队列,如下图
prev
AQS多节点构建
t2
thread = t2
t1
new Node()
首先会new Node()
head = null
tail = null
有线程要进入队列进行阻塞时
state = 1其他线程获取的锁
thread = null
node0进行队列,排队等待执行。会将prev执行的节点的waitstatus的属性置为-1
head
CLH队列
AQS整体的初始状态
state = 1
node0引用的线程被执行,所以置为null
waitstatus =0
1.程序启动时创建五个线程,命名t1....t52.在线程的run方法中使用lock方法,不释放锁3.将t3线程休眠几秒再启动,t3将是所有线程中排在队列中最后的一个node4.查看t3线程node节点上的prev的waitstatus属性即可
waitstatus =-1
0 条评论
下一页