导读 | 这篇文章主要为大家介绍了并发编程ConcurrentLinkedQueue使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 |
ConcurrentLinkedQueue是非阻塞线程安全的队列,适用于高并发的场景。是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)
具有队列的功能;实现了Queue接口,可作为队列使用。
private transient volatile Nodehead; 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操作是获取链表头部一个元素(只读取不移除)。
原文来自:
本文地址://q13zd.cn/concurrent-linked-queue.html编辑:倪家兴,审核员:逄增宝
Linux大全:
Linux系统大全: