概述
ConcurrentLinkedQueue 是单向链表结构的无界并发队列。从JDK1.7开始加入到J.U.C的行列中。使用CAS实现并发安全,元素操作按照 FIFO (first-in-first-out 先入先出) 的顺序。适合“单生产,多消费”的场景。
非阻塞算法
在 Michael-Scott (麦克尔,斯科特 )非阻塞队列算法上进行一下修改
实现了 松弛阀值 即惰性更新的策略,容忍了 tail 不能及时更新, 因不需要及时更新tail 算法中也减少了 其他线程 帮助 处理中间状态 (参考资料中讲解 中间状态)的步骤
下面列出 ConcurrentLinkedQueue 非阻塞算法要点
- 使用 CAS 原子指令来处理对数据的并发访问,这是非阻塞算法得以实现的基础,
- CAS执行前 需要前置条件。
- 惰性更新 head tail
- 性能优化:head tail 发生变化 及时获取,减少遍历次数
- 使用“自链接”方式管理出队节点,这样一个自链接节点意味着需要从head向后推进。
源码分析
offer
方法逻辑如下:
向队列写入节点,先创建新的节点, 从尾部开始循环查找,如果发现尾部没有节点 ,连接到
尾部,否则检查尾部节点是否自链接,否则如果tail节点更新获取tail结点,没有更新获取下个节点检查是否可以链接。
public boolean offer(E e) {
checkNotNull(e);
final Node<E> newNode = new Node<E>(