共计 1696 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 这篇文章主要为大家介绍了并发编程 ConcurrentLinkedQueue 使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 |
ConcurrentLinkedQueue
ConcurrentLinkedQueue 是非阻塞线程安全的队列,适用于高并发的场景。是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置 null 元素(内部实现的特殊节点除外)
ConcurrentLinkedQueue 原理
ConcurrentLinkedQueue 类继承 AbstractQueue 抽象类
具有队列的功能; 实现了 Queue 接口,可作为队列使用。
ConcurrentLinkedQueue 操作方法
private transient volatile Node head;
private transient volatile Node tail;
public ConcurrentLinkedQueue() {head = tail = new Node (null);
}
构造函数中,新建了一个“内容为 null 的节点”,并设置表头 head 和表尾 tail 的值为新节点。head 和 tail 是 volatile 类型,具有 volatile 赋予的含义:“即对一个 volatile 变量的读,总是能看到(任意线程)对这个 volatile 变量最后的写入”。
private static class Node {
volatile E item;
volatile Node next;
Node(E item) {UNSAFE.putObject(this, itemOffset, item);
}
}
Node 是单向链表节点,next 指向下一个 Node,item 用于存储数据。Node 中操作节点数据的 API,是通过 Unsafe 机制的 CAS 函数实现的;例如 casNext() 是通过 CAS 函数“比较并设置节点的下一个节点”。
1、添加
以 add(E e) 为例对 ConcurrentLinkedQueue 中的添加
public boolean add(E e) {return offer(e);
}
add() 实际上是调用的 offer() 来完成添加操作的;offer(E e) 的作用就是将元素 e 添加到链表的末尾。
2、删除
poll():在链表头部获取并且移除一个元素
poll() 的作用就是删除链表的表头节点,并返回被删节点对应的值。
3、peek 操作
peek 操作是获取链表头部一个元素(只读取不移除)。
正文完
星哥玩云-微信公众号