Fork/Join模式(JSR166y)手記之ConcurrentLinkedDeque
ConcurrentLinkedDeque是JSR166y中新增的一個(gè)無(wú)界并發(fā)Deque實(shí)現(xiàn),基于已鏈接節(jié)點(diǎn)的、任選范圍的雙端隊(duì)列。在迭代時(shí),隊(duì)列保持弱一致性,但不會(huì)拋出ConcurrentModificationException異常。
需要小心,與大多數(shù) collection 不同,size 方法不是一個(gè)固定時(shí)間操作。由于這些隊(duì)列的異步特性,確定當(dāng)前元素的數(shù)量需要遍歷這些元素。
另外,一些批量操作,諸如 addAll, removeAll, retainAll, containsAll, equals, toArray等,不能夠保證會(huì)立刻執(zhí)行。比如通過(guò)addAll方法批量提交若干元素,于此同時(shí)另一線程在迭代時(shí),可能只能訪問(wèn)到先前存在的元素。
內(nèi)存一致性效果:當(dāng)存在其他并發(fā) collection 時(shí),將對(duì)象放入 ConcurrentLinkedDeque 之前的線程中的操作 happen-before 隨后通過(guò)另一線程從 ConcurrentLinkedDeque 訪問(wèn)或移除該元素的操作。
先前存在一個(gè)線程安全并阻塞的LinkedBlockingDeque實(shí)現(xiàn),現(xiàn)在好了,又多了個(gè)并發(fā)實(shí)現(xiàn),這樣和Queue保持一致,并發(fā)和阻塞版本都具有了。嗯,果然是好事要成雙。
在使用上沒(méi)有什么可說(shuō)的,隨時(shí)查看API DOC,即可。剛開(kāi)始以為Fork/Join的工作竊取(work stealing)機(jī)制內(nèi)部使用ConcurrentLinkedDeque實(shí)現(xiàn),查看ForkJoinPool源代碼時(shí),不曾發(fā)現(xiàn)其身影。
posted on 2012-02-06 20:39 nieyong 閱讀(1242) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): Java