為什么java.util.concurrent 包里沒有並發的ArrayList實現?


摘要: 原文鏈接 作者:Stephen C 譯者:鄭旭東  校對:方騰飛 問:JDK 5在java.util.concurrent里引入了ConcurrentHashMap,在需要支持高並發的場景,我們可以使用它代替HashMap。

原文鏈接 作者:Stephen C 譯者:鄭旭東  校對:方騰飛

 

問:JDK 5在java.util.concurrent里引入了ConcurrentHashMap,在需要支持高並發的場景,我們可以使用它代替HashMap。但是為什么沒有ArrayList的並發實現呢?難道在多線程場景下我們只有Vector這一種線程安全的數組實現可以選擇么?為什么在java.util.concurrent 沒有一個類可以代替Vector呢?

答:我認為在java.util.concurrent包中沒有加入並發的ArrayList實現的主要原因是:很難去開發一個通用並且沒有並發瓶頸的線程安全的List。

 

像ConcurrentHashMap這樣的類的真正價值(The real point / value of classes)並不是它們保證了線程安全。而在於它們在保證線程安全的同時不存在並發瓶頸。舉個例子,ConcurrentHashMap采用了鎖分段技術和弱一致性的Map迭代器去規避並發瓶頸。

所以問題在於,像“Array List”這樣的數據結構,你不知道如何去規避並發的瓶頸。拿contains() 這樣一個操作來說,當你進行搜索的時候如何避免鎖住整個list?

另一方面,Queue 和Deque (基於Linked List)有並發的實現是因為他們的接口相比List的接口有更多的限制,這些限制使得實現並發成為可能。

CopyOnWriteArrayList是一個有趣的例子,它規避了只讀操作(如get/contains)並發的瓶頸,但是它為了做到這點,在修改操作中做了很多工作和修改可見性規則。 此外,修改操作還會鎖住整個List,因此這也是一個並發瓶頸。所以從理論上來說,CopyOnWriteArrayList並不算是一個通用的並發List。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM