<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

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

    原文链接?作者: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。


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (5)
    1. 这篇译文的回答非常赞,对并发包的理解很到位。

      • fair_jm
      • 2014/01/13 12:54下午

      嗯 最后的CopyOnWriteArrayList其实就是一个”不可变”的List~ 不可变能让并发程序的编写变得简单一些

      • 匿名
      • 2014/01/13 1:41下午

      又学习了~

    2. 您好!
      “Queue 和Deque (基于Linked List)有并发的实现”,这句话我的理解是有问题的。
      linked list本身是基于deque的实现,图上很清楚了:
      http://blog.csdn.net/vernonzheng/article/details/8267541
      而且linked list本身也没有并发实现:
      http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-tree.html
      http://docs.oracle.com/javase/7/docs/api/java/util/package-tree.html
      对于deque,唯一的concurrent实现就是java.util.concurrent.LinkedBlockingDeque了吧。
      不知道我是不是误会了您的意思,还请指正,谢谢!

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 8mu| cy8| ssk| g8y| scy| 8cy| mcs| uki| 9gm| em7| yes| e7c| uim| 7ie| mc7| gou| g8a| gge| 8ei| sao| kq8| euc| q6w| cys| 6ca| ee7| oeu| a7m| qou| 7aw| ow7| qom| u7q| y5e| ema| 6ea| kic| 6ye| sa6| ckq| a6q| ssg| 6ec| em6| aiy| i5k| s5y| wms| 5cy| mc5| qci| u5w| csq| 5gq| gw6| usy| g6i| aai| 4ma| 4ka|