专栏首页听Allen瞎扯淡为什么java.util.concurrent 包里没有并发的ArrayList实现?

为什么java.util.concurrent 包里没有并发的ArrayList实现?

问: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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Fetch Size 与 JDBC 内存管理

    接触到 JDBC 的 Fetch Size 这个属性缘起一个性能问题,项目中需要将一个有千万级数据量的表中的记录导出到文件中去。按照正常的路数,先初始化连接;接...

    Allen Cheng
  • Ubnt UniFi 产品开箱

    家里的无线网络覆盖一直有些问题,虽然说已经在家里部署了两个无线AP,但是还是一些小问题,首先信号覆盖还是有一些死角,比如说,卫生间,一进卫生间,信号强度瞬间掉到...

    Allen Cheng
  • Integer的highestOneBit方法源码解析

    在读HashMap源码的时候,遇到了Integer的highestOneBit静态方法不是太理解,所以就读了一下源码,这里记录一下。

    Allen Cheng
  • 2019 Java 高并发学习路线图

    有这些困惑很正常,因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,而这些知识点看上去非常的零散、独立,可...

    用户1655470
  • 1033 旧键盘打字 (20 分)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

    可爱见见
  • Nginx 烹调书

    本书是「Complete Nginx Cookbook」一书的部分中英文对照翻译版本。

    柳公子
  • 学习HTML5之表单

    HTML5 的标准已经定了,应该火了,或者已经火了。那么是不是可以学习一下呢? 目前h5的主场还是在手机端,pc还是受困于浏览器的兼容,主要是IE在拖后腿。所以...

    用户1174620
  • Python: 异常处理

    用户2183996
  • 聊聊sql的并发update

    codecraft
  • Nginx爆发超级漏洞,已修复

    近日,Nginx官方更新邮件列表,对外通报Nginx0.8.41-1.5.6版本存在两类高危漏洞,经过安全机构研究团队确认,漏洞确实存在。 使用受...

    安恒信息

扫码关注云+社区

领取腾讯云代金券