深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue
2024-09-17 04:08:45 218人阅读
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) { |
05 |
throw new NullPointerException(); |
07 |
Node</e><e> n = new Node</e><e>(e); |
13 |
if (t.casNext( null , n) && casTail(t, n)) { |
深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。