如何一图看懂ConcurrentLinkedQueue的高并发原理?
- 内容介绍
- 文章标签
- 相关推荐
让我们一起... 上篇文章聊到并发集合CopyOnWeiteArrayList的实现与特点, 其不足之处是不适合写多的场景也不适合并发量大的场景,哎呀,真的好烦躁啊!
什么是哨兵节点?
完善一下。 哨兵节点又称虚拟节点,哨兵节点常使用在链表这种数据结构中,我真希望能够简单地理解它。

public ConcurrentLinkedQueue { 卷不动了。 head = tail = new Node; }
代码语言:java, 我不太喜欢java,但是它真的很有用,我们一起...。
入队操作分析
在分析源码前, 先来说明一些复杂变量的作用,比如t记录尾节点tail好难记啊!
在入队时分三种情况:种,我已经晕了。
| 队列实现 | 并发性能 | 适用场景 |
|---|---|---|
| ConcurrentLinkedQueue | 高 | 数据量大、 并发高、频繁读写、操作队头、队尾 |
| CopyOnWriteArrayList | 低 | 读多写少 |
心情复杂。 本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~,我真的很期待你们的反馈。
ConcurrentLinkedQueue的设计思想
ConcurrentLinkedQueue主要的操作是入队、 出队,我们使用offer和poll来对其进行分析,好麻烦啊,无语了...!
在第四次出队时会满足第三种情况, 但此时p就是首节点,所以呢不会更新首节点,然后返回Null,我已经完全糊涂了,观感极佳。。
当操作的是第一个节点时 如果在第一个节点前面加个虚拟节点,那么就不用特殊处理,多么聪明的想法啊!
- **使用延迟更新首尾节点的思想, 大大减少CAS次数,提升并发性能**;
- **使用哨兵节点,降低代码复杂度,避免一个节点时的竞争**;
- **基于单向链表实现,使用volatile保证可见性,使得在读场景下不需要使用其他同步机制**;
- **写场景中采用乐观锁的思想,使用CAS+失败重试来保证操作的原子性**;
别犹豫... p用于循环遍历的节点,当p节点为真正头节点时才允许出队我终于明白了一点。
CAS和volatile的重要性
CAS和volatile是理解ConcurrentLinkedQueue的关键, 如果不理解它们,可以查看相关文章,好多文章啊!比如15000字、 6个代码案例、5个原理图让你彻底搞懂Synchronized 的第二小节,还有5个案例和流程图让你从0到1搞懂volatile关键字,多么令人头大的标题啊!😵💫
Gitee-JavaConcurrentProgramming/src/main/java/F_Collections, 还有Github-JavaConcurrentProgramming/src/main/java/F_Collections, 太治愈了。 感兴趣的同学可以看看,我就不看了。
关注菜菜, 分享更多干货,公众号:菜菜的后端私房菜,我要关注吗?🤔
一下吧!👏🏻
本篇文章到这里就结束了希望你能够对ConcurrentLinkedQueue有更深的理解,这事儿我得说道说道。。
有什么问题可以在评论区交流, 如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~
阅读本文大概需要10分钟
Gitee-JavaConcurrentProgramming/src/main/java/F_Collections
| 测试用例 J娱乐A python C++ JavaScript | |||||
| 100 80 60 70 | |||||
| 50% 40% 30% 20% | |||||
让我们一起... 上篇文章聊到并发集合CopyOnWeiteArrayList的实现与特点, 其不足之处是不适合写多的场景也不适合并发量大的场景,哎呀,真的好烦躁啊!
什么是哨兵节点?
完善一下。 哨兵节点又称虚拟节点,哨兵节点常使用在链表这种数据结构中,我真希望能够简单地理解它。

public ConcurrentLinkedQueue { 卷不动了。 head = tail = new Node; }
代码语言:java, 我不太喜欢java,但是它真的很有用,我们一起...。
入队操作分析
在分析源码前, 先来说明一些复杂变量的作用,比如t记录尾节点tail好难记啊!
在入队时分三种情况:种,我已经晕了。
| 队列实现 | 并发性能 | 适用场景 |
|---|---|---|
| ConcurrentLinkedQueue | 高 | 数据量大、 并发高、频繁读写、操作队头、队尾 |
| CopyOnWriteArrayList | 低 | 读多写少 |
心情复杂。 本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~,我真的很期待你们的反馈。
ConcurrentLinkedQueue的设计思想
ConcurrentLinkedQueue主要的操作是入队、 出队,我们使用offer和poll来对其进行分析,好麻烦啊,无语了...!
在第四次出队时会满足第三种情况, 但此时p就是首节点,所以呢不会更新首节点,然后返回Null,我已经完全糊涂了,观感极佳。。
当操作的是第一个节点时 如果在第一个节点前面加个虚拟节点,那么就不用特殊处理,多么聪明的想法啊!
- **使用延迟更新首尾节点的思想, 大大减少CAS次数,提升并发性能**;
- **使用哨兵节点,降低代码复杂度,避免一个节点时的竞争**;
- **基于单向链表实现,使用volatile保证可见性,使得在读场景下不需要使用其他同步机制**;
- **写场景中采用乐观锁的思想,使用CAS+失败重试来保证操作的原子性**;
别犹豫... p用于循环遍历的节点,当p节点为真正头节点时才允许出队我终于明白了一点。
CAS和volatile的重要性
CAS和volatile是理解ConcurrentLinkedQueue的关键, 如果不理解它们,可以查看相关文章,好多文章啊!比如15000字、 6个代码案例、5个原理图让你彻底搞懂Synchronized 的第二小节,还有5个案例和流程图让你从0到1搞懂volatile关键字,多么令人头大的标题啊!😵💫
Gitee-JavaConcurrentProgramming/src/main/java/F_Collections, 还有Github-JavaConcurrentProgramming/src/main/java/F_Collections, 太治愈了。 感兴趣的同学可以看看,我就不看了。
关注菜菜, 分享更多干货,公众号:菜菜的后端私房菜,我要关注吗?🤔
一下吧!👏🏻
本篇文章到这里就结束了希望你能够对ConcurrentLinkedQueue有更深的理解,这事儿我得说道说道。。
有什么问题可以在评论区交流, 如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~
阅读本文大概需要10分钟
Gitee-JavaConcurrentProgramming/src/main/java/F_Collections
| 测试用例 J娱乐A python C++ JavaScript | |||||
| 100 80 60 70 | |||||
| 50% 40% 30% 20% | |||||

