爲何java.util.concurrent 包裏沒有併發的ArrayList實現?java
問: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。併發
原創文章,轉載請註明: 轉載自併發編程網 – ifeve.com本文連接地址: 爲何java.util.concurrent 包裏沒有併發的ArrayList實現?高併發