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源代碼時,不曾發現其身影。