JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析,ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全?

ConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构是使用单向链表实现,入队和出队操作是使用我们经常提到的CAS来保证线程安全的。

我们首先看一下ConcurrentLinkedQueue的类图结构先,好有一个内部逻辑有一个大概的印象,如下图所示:

Java并发编程笔记之ConcurrentLinkedQueue源码探究

可以清楚的看到ConcurrentLinkedQueue内部的队列是使用单向链表方式实现,类中两个volatile 类型的Node 节点分别用来存放队列的首位节点。

首先我们先来看一下ConcurrentLinkedQueue的构造函数,如下:

public ConcurrentLinkedQueue() {
   head = tail = new Node<E>(null);
}

通过无参构造函数可知默认头尾节点都是指向 item 为 null 的哨兵节点。

Node节点内部则维护一个volatile 修饰的变量item 用来存放节点的值,next用来存放链表的下一个节点,从而链接为一个单向无界链表,这就是单向无界的根本原因。如下图:

Java并发编程笔记之ConcurrentLinkedQueue源码探究

 

接下来看ConcurrentLinkedQueue 主要关注入队,出队,获取队列元素的方法的源码,如下所示:

1.首先看入队方法offer,offer 操作是在队列末尾添加一个元素,如果传递的参数是 null 则抛出 NPE 异常,否者由于 ConcurrentLinkedQueue 是无界队列该方法一直会返回 true。另外由于使用 CAS 无阻塞算法,该方法不会阻塞调用线程,其源码如下:

>>>>阅读全文

相关文章:

  • 2021-12-05
  • 2022-01-22
  • 2021-06-15
  • 2021-12-01
  • 2021-06-24
  • 2021-06-09
  • 2021-09-28
  • 2021-05-14
猜你喜欢
  • 2021-04-21
  • 2021-10-10
  • 2021-12-19
  • 2021-10-04
  • 2021-10-06
相关资源
相似解决方案