AQS-新加入的节点是怎么进入队列的

首先节点会进入队列,肯定是竞争同步状态失败了,所以会调用addWaiter()方法来入队,addWaiter()方法如下:
AQS-新加入的节点是怎么进入队列的
如截图中所示,在这个方法中,会构建出一个与当前线程相关的新节点,然后判断尾节点是否不为null,如果不为null,则说明队列已经初始化成功了,那么就把新的节点设置为尾节点,如果尾节点为空,那么说明队列还没完成初始化,那么就走enq()方法,enq()方法如下:
AQS-新加入的节点是怎么进入队列的
如上截图,enq()方法有一个无限循汗逻辑,既然走到了这步,就说明队列还没完成初始化,假设没有其他的线程捷足先登做了初始化队列的工作,所以这时尾节点还是等于null的,所以就会通过compareAndSetHead(new Node())方法设置一个新节点,注意这个新节点不是我们传进来的那个要进队列的那个节点,而是又重新new 出来的一个node对象,然后把这个新的node对象设置为队列的头节点和尾节点,第一次循环结束,这时候因为是无限循环,所以第二次循环开始,这时候再去取尾节点,就会发现尾节点不再为null了,然后就会走else中的逻辑,把要入队的新节点设置为队列的尾节点。

新加入的节点进入队列的流程图

AQS-新加入的节点是怎么进入队列的