首页 > 代码库 > 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue

深入理解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