ConcurrentHashMap类似于CopyOnWriteArrayList

我使用CopyOnWriteArrayList相当多。 这是特别真实的时候

  • 线程执行大量的读取
  • 线程执行一些写操作
  • 不过,我会在使用Collections.synchronizedList()时候

  • 线程执行一些阅读
  • 线程执行大量写操作
  • 这是因为根据CopyOnWriteArrayList Java Doc

    ArrayList的线程安全变体,其中所有可变操作(add,set等)都通过创建底层数组的新副本来实现。

    这通常太昂贵,...

    当谈到ConcurrentHashMap ,我想知道在选择ConcurrentHashMap不是Collections.synchronizedMap()是否仍然可以应用相同的逻辑?

    ConcurrentHashMap是否每次执行写入操作时都会创建底层数据结构的新副本? 如果写入操作多于读取操作,它是否会比Collections.synchronizedMap执行得更糟?


    不, ConcurrentHashMap不会创建底层数据结构的新副本。

    ConcurrentHashMap是一个分段映射,段数基于并发级别。 当你写入一个段时,它会被锁定,直到写入完成。


    当写入ConcurrentHashMap ,它只锁定正在写入的Map的内部部分。因此,通过这种行为,我们可以很容易地看到它不会创建新副本,而是在同一副本中进行更改。
    因此,当我们尝试在ConcurrentHashMap编写代码时,这意味着我们正在尝试写入任何段,然后只锁定该段并更新该段。因此,简单地说,它永远不会生成任何新的副本。 所以你的问题的答案是否定的。


    ConcurrentHashMap几乎总是正确的,因为它具有更好的性能和更有用的API(你可以避免check-then-set线程问题)
    它使用锁定剥离进行更细粒度的访问,并且不复制地图。
    您不应该使用ConcurrentHashMap唯一应用程序是当您需要锁定地图以进行独占访问时

    链接地址: http://www.djcxy.com/p/76109.html

    上一篇: Is ConcurrentHashMap analogy to CopyOnWriteArrayList

    下一篇: Why do I need to override the equals and hashCode methods in Java?