总体的详细脉络上图写的已经非常详细,此处额外补充一些基础知识
cas操作究竟是什么意思
jdk源代码里经常看到如
设置尾
compareAndSetTail(Node expect, Node update) #unsafe.compareAndSwapObject(this, headOffset, null, update)
设置头
compareAndSetHead(Node update) #unsafe.compareAndSwapObject(this, tailOffset, expect, update)
compareAndSetWaitStatus和compareAndSetNext等 都是Unsafe类是在sun.misc包下的调用
aqs队列的结构图
懒得画了贴一个别人的
特别注意head的节点的线程值是null 任何正在占有锁的node的线程值都要设置成null
node.thread = null;
node.prev = null;
原因笔者忘记了,有知道的可以评论区指点。