摘要: 原文鏈接 作者: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的接口有更多的限制,這些限制使得實現並發成為可能。