上图显示的是:有两个元素,处在静止状态的队列
插入操做在插入新元素(A)以前,先检查队列是否处在中间状态。若是是在中间状态,那么确定有其余线程已经处在元素插入的中途,在步骤(C)和(D)之间。没必要等候其余线程完成,当前线程就能够 “帮助” 它完成操做,把尾指针向前移动(B)。若是有必要,它还会继续检查尾指针并向前移动指针,直到队列处于静止状态,这时它就能够开始本身的插入了。
第一个 CAS(C)可能由于两个线程竞争访问队列当前的最后一个元素而失败;在这种状况下,没有发生修改,失去 CAS 的线程会从新装入尾指针并再次尝试。若是第二个 CAS(D)失败,插入线程不须要重试 —— 由于其余线程已经在步骤(B)中替它完成了这个操做!
上图显示的是:处在插入中间状态的队列,在新元素插入以后,尾指针更新以前
上图显示的是:在尾指针更新后,队列从新处在静止状态