深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue

Posted 张俊鸿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue相关的知识,希望对你有一定的参考价值。

1.    引言

在并发编程中我们有时候需要使用线程安全的队列。

如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。

使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,

非阻塞的实现方式则可以使用循环CAS的方式来实现,本文让我们一起来研究下如何使用非阻塞的方式来实现线程安全队列ConcurrentLinkedQueue的。

2.    ConcurrentLinkedQueue的介绍

ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,

当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。

 

入队列就是将入队节点添加到队列的尾部

tail.casNext(null, n)   CAS算法,往tail的Next 设入队节点n。

tail.casTail(tail, n)   CAS算法,把入队节点n 标记为tail 。

 

01 public boolean offer(E e) {
02  
03        if (e == null)
04  
05          throw new NullPointerException();
06  
07       Node</e><e> n = new Node</e><e>(e);
08  
09       for (;;) {
10  
11          Node</e><e> t = tail;
12  
13          if (t.casNext(null, n) && casTail(t, n)) {
14  
15             return true;
16  
17          }
18  
19       }
20  
21     }

 


以上是关于深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue的主要内容,如果未能解决你的问题,请参考以下文章

原创Java并发编程系列33 | 深入理解线程池(上)

深入理解Java多线程 - Java并发编程的艺术

基于JVM原理JMM模型和CPU缓存模型深入理解Java并发编程

深入理解Java并发编程之核心原理概念

深入理解Java并发编程之核心原理概念

并发编程7:深入理解Java虚拟机-锁优化