如何一图看懂ConcurrentLinkedQueue的高并发原理?

2026-05-21 22:034阅读0评论服务器VPS
  • 内容介绍
  • 文章标签
  • 相关推荐

让我们一起... 上篇文章聊到并发集合CopyOnWeiteArrayList的实现与特点, 其不足之处是不适合写多的场景也不适合并发量大的场景,哎呀,真的好烦躁啊!

什么是哨兵节点?

完善一下。 哨兵节点又称虚拟节点,哨兵节点常使用在链表这种数据结构中,我真希望能够简单地理解它。

12张图一次性搞懂高性能并发容器ConcurrentLinkedQueue

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的实现与特点, 其不足之处是不适合写多的场景也不适合并发量大的场景,哎呀,真的好烦躁啊!

什么是哨兵节点?

完善一下。 哨兵节点又称虚拟节点,哨兵节点常使用在链表这种数据结构中,我真希望能够简单地理解它。

12张图一次性搞懂高性能并发容器ConcurrentLinkedQueue

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%