ConcurrentLinkedDeque是JSR166y中新增的一个无界并发Deque实现,基于已链接节点的、任选范围的双端队列。在迭代时,队列保持弱一致性,但不会抛出ConcurrentModificationException异常。
需要小心,与大多数 collection 不同,size 方法不是一个固定时间操作。由于这些队列的异步特性,确定当前元素的数量需要遍历这些元素。
另外,一些批量操作,诸如 addAll, removeAll, retainAll, containsAll, equals, toArray等,不能够保证会立刻执行。比如通过addAll方法批量提交若干元素,于此同时另一线程在迭代时,可能只能访问到先前存在的元素。
内存一致性效果:当存在其他并发 collection 时,将对象放入 ConcurrentLinkedDeque 之前的线程中的操作 happen-before 随后通过另一线程从 ConcurrentLinkedDeque 访问或移除该元素的操作。
先前存在一个线程安全并阻塞的LinkedBlockingDeque实现,现在好了,又多了个并发实现,这样和Queue保持一致,并发和阻塞版本都具有了。嗯,果然是好事要成双。
在使用上没有什么可说的,随时查看API DOC,即可。刚开始以为Fork/Join的工作窃取(work stealing)机制内部使用ConcurrentLinkedDeque实现,查看ForkJoinPool源代码时,不曾发现其身影。