ConcurrentLinkedQueue 小坑

在查看源码时,添加元素时(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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。