JUC源码分析-容器-ConcurrentLinkedQueue

概述

ConcurrentLinkedQueue 是单向链表结构的无界并发队列。从JDK1.7开始加入到J.U.C的行列中。使用CAS实现并发安全,元素操作按照 FIFO (first-in-first-out 先入先出) 的顺序。适合“单生产,多消费”的场景。

非阻塞算法

在 Michael-Scott (麦克尔,斯科特 )非阻塞队列算法上进行一下修改

实现了 松弛阀值 即惰性更新的策略,容忍了 tail 不能及时更新, 因不需要及时更新tail 算法中也减少了 其他线程 帮助 处理中间状态 (参考资料中讲解 中间状态)的步骤

下面列出 ConcurrentLinkedQueue 非阻塞算法要点

  1. 使用 CAS 原子指令来处理对数据的并发访问,这是非阻塞算法得以实现的基础,
  2. CAS执行前 需要前置条件。
  3. 惰性更新 head tail
  4. 性能优化:head tail 发生变化 及时获取,减少遍历次数
  5. 使用“自链接”方式管理出队节点,这样一个自链接节点意味着需要从head向后推进。

 

源码分析

offer

方法逻辑如下:

向队列写入节点,先创建新的节点, 从尾部开始循环查找,如果发现尾部没有节点 ,连接到

尾部,否则检查尾部节点是否自链接,否则如果tail节点更新获取tail结点,没有更新获取下个节点检查是否可以链接。

public boolean offer(E e) {

checkNotNull(e);

final Node<E> newNode = new Node<E>(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值