Java Thread&Concurrency(13): 深入理解ConcurrentLinkedQueue及其实现原理
来源:互联网 发布:5s支持4g网络吗 编辑:程序博客网 时间:2024/06/10 07:27
ConcurrentLinkedQueue是一个基于链表实现的非阻塞队列,特点是head和tail是可以滞后的,甚至tail落到head的后面,准确得说,是当事实的head距离当前head至少两个link时才会修改head,这种设计可以在某些时候提高效率。
我们接着来看源码实现,这里主要是offer和poll方法:
public boolean offer(E e) { checkNotNull(e); final Node<E> newNode = new Node<E>(e); for (Node<E> t = tail, p = t;;) { Node<E> q = p.next; if (q == null) { // p is last node if (p.casNext(null, newNode)) { if (p != t) // hop two nodes at a time casTail(t, newNode); // Failure is OK. return true; } // Lost CAS race to another thread; re-read next } else if (p == q) p = (t != (t = tail)) ? t : head; else // Check for tail updates after two hops. p = (p != t && t != (t = tail)) ? t : q; } }
- 根据数据构造节点newNode,取得尾节点tail。
- 接着判断next,假如不为空则取它或者取得新的head节点或者新的tail,这里依据此时是否tail已经滞后head了,以及tail已经被修改。
- 假如next为nul,则尝试CAS添加newNode到当前实际的尾节点p,这里的CAS操作就是可线性化点。
- 如果上述成功,则在尾节点距离达到或者超过2个link时更新尾节点。
- 直接返回true。
poll方法:
public E poll() { restartFromHead: for (;;) { for (Node<E> h = head, p = h, q;;) { E item = p.item; if (item != null && p.casItem(item, null)) { if (p != h) // hop two nodes at a time updateHead(h, ((q = p.next) != null) ? q : p); return item; } else if ((q = p.next) == null) { updateHead(h, p); return null; } else if (p == q) continue restartFromHead; else p = q; } } }
- 取得头结点,假如item为null或者CAS失败,则需要向后更新p结点,这里取得新p的方式无非就是沿着next链。
- 当CAS操作成功之后,同样是距离2个link时更新head结点,然后返回数据。
关于ConcurrentLinkedQueue就是以上这些,总体来说,对于使用者来说,它是个基于链表的、不会阻塞的队列。
0 0
- Java Thread&Concurrency(13): 深入理解ConcurrentLinkedQueue及其实现原理
- Java Thread&Concurrency(9): 深入理解StampedLock及其实现原理
- Java Thread&Concurrency(10): 深入理解ThreadLocal及其实现原理
- Java Thread&Concurrency(11): 深入理解ThreadPoolExecutor及其实现原理
- Java Thread&Concurrency(12): 深入理解AbstractExecutorService及其实现原理
- Java Thread&Concurrency(15): 深入理解ScheduledThreadPoolExecutor及其实现原理
- Java Thread&Concurrency(16): 深入理解ArrayBlockingQueue及其实现原理
- Java Thread&Concurrency(14): 深入理解条件队列(Condition)及其实现原理
- Java Thread&Concurrency(8): 深入理解CompletionService接口及其实现
- Java Thread&Concurrency(2): 深入理解ConcurrentSkipListMap实现原理
- Java Thread&Concurrency(3): 深入理解SynchronousQueue实现原理
- Java Thread&Concurrency(4): 深入理解Exchanger实现原理
- Java Thread&Concurrency(5): 深入理解Phaser实现原理
- Java Thread&Concurrency(7): 深入理解Callable/Future(FutureTask)接口及其实现
- 深入Java集合学习系列:ConcurrentLinkedQueue及其实现原理
- 深入理解StampedLock及其实现原理
- Java Thread&Concurrency(1): 深入理解Fork-Join并发执行框架
- java concurrency: ThreadLocal及其实现机制
- CSpinButtonCtrl的用法
- Android中Service组件详解
- Linux C 获取当前进程可执行文件路径
- iOS 脚本修改plist文件
- 怎么将pdf转Word中英文转换器在线转换
- Java Thread&Concurrency(13): 深入理解ConcurrentLinkedQueue及其实现原理
- 2014年辛星Javascript解读第三节
- A*寻路算法
- SVN服务器搭建和使用(一)
- 2014年辛星Javascript解读第四节 流程控制语句
- 前百度员工离职总结:如何做个好员工?
- 30天学习30种新技术系列
- APP运营:合理化推送向数据看齐
- ubuntu 安装软件,卸载软件,查看软件 等命令的使用