为什么java.util.concurrent 包里没有并发的ArrayList实现?
来源:互联网 发布:白葡萄酒淘宝 编辑:程序博客网 时间:2024/04/30 10:01
问: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。
http://ifeve.com/why-is-there-not-concurrent-arraylist-in-java-util-concurrent-package/#comment-5107
0 0
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?
- java并发包java.util.concurrent
- java线程并发包util.concurrent的研究(一)
- java线程并发包util.concurrent的研究(二)
- java线程并发包util.concurrent的研究(三)
- java线程并发包util.concurrent的研究(四)
- java线程并发包util.concurrent的研究(五)
- java线程并发包util.concurrent的研究(六)
- java线程并发包util.concurrent的研究(七)
- 浅谈java.util.concurrent包的并发处理
- 浅谈java.util.concurrent包的并发处理
- 浅谈java.util.concurrent包的并发处理
- 浅谈java.util.concurrent包的并发处理
- 浅谈java.util.concurrent包的并发处理
- 浅谈java.util.concurrent包的并发处理
- vb.net datagridview中保存到xml
- html中position的一个小用法
- 2013 年度最新的 20 大热门开源软件
- jquery的css之--获取位置偏移函数position()
- Spring +0配置+0注解Autowire Bean对象
- 为什么java.util.concurrent 包里没有并发的ArrayList实现?
- 使用route(路由)模拟镜像数据包
- 使用 Osql 工具管理 SQL Server 桌面引擎 (MSDE 2000)应用介绍
- 关于JAVA中为什么每个编译单元内都只能有一个public类
- jquery和JSON结合
- java23设计模式思想
- HDU 2544 最短路 (SSSP & O(V^2)的Dijkstra算法)
- OSTaskCreateExt分析
- 抽象类和接口