为何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实现?高并发