博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么java.util.concurrent 包里没有并发的ArrayList实现?
阅读量:5745 次
发布时间:2019-06-18

本文共 771 字,大约阅读时间需要 2 分钟。

 作者: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。

转载地址:http://qiozx.baihongyu.com/

你可能感兴趣的文章
《启示录》读书笔记三
查看>>
多级菜单系统安装维护shell脚本实现企业级案例
查看>>
闲话软件开发人员
查看>>
通过Python脚本理解系统进程间通信
查看>>
编写shell脚本计划备份mysql数据库
查看>>
【博客话题】回顾三年的项目管理经历
查看>>
CentOS安装 出现Disk sda contains BIOS RAID metadata解决方法
查看>>
大话java jvm之内存【测试帮日记公开课】
查看>>
设计功能和界面测试用例
查看>>
思科路由器静态PAT端口范围测试
查看>>
25台服务器怎样支撑世界第54大网站
查看>>
python自动化测试开发利器ulipad最佳实践(可写python测试代码也可编写selenium、Appium等)...
查看>>
【编译打包】nginx 1.4.0 SRPM
查看>>
精品软件 推荐 硬盘性能提升工具 Primo Ramdisk 内存虚拟成硬盘软件
查看>>
Linux系统程序包管理工具-RPM
查看>>
[JavaScript] 面向对象
查看>>
2017国赛小结
查看>>
Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月28日-2月3日)
查看>>
rsync工作方式介绍03
查看>>
PowerBI从SCCM数据库中分析数据和KPI展现
查看>>