在查看源码时,添加元素时(offer(e)),发现链表并未按 head-node1-node2(tail)的顺序排列。导致走读poll代码时发现自己理解的逻辑和代码执行不一致。实际顺序为 node1(head)-node2(tail)。
原因就出来head节点上,在连续debug十几次后,发现了问题所在。
JDK8源码:
JDK11 源码:
其中核心代码为:p.casNext(null, newNode) || NEXT.compareAndSet(p,null, newNode)
这两句不同jdk内不同的实现方式功能都是一样,通过cas从链表尾部添加一个新节点。
如果是添加第一个节点,在添加成功新节点后,还做了以下两件事:
1.将head指针指向新节点。
2.将初始化的哨兵节点设置为自引用(将Node中的next指针指向自己)。
注意:阻塞队列LinkedBlockingQueue单向链表顺序却是 Head--->Node1---->Node2(Last)