ConcurrentHashMap类似于CopyOnWriteArrayList

时间:2013-04-11 07:54:20

标签: java

我使用CopyOnWriteArrayList非常多。

时尤其如此
  • 线程执行大量读取
  • 线程执行一些写入

但是,我会在

时使用Collections.synchronizedList()
  • 线程执行一些阅读
  • 线程执行大量写入

这是因为根据CopyOnWriteArrayList Java Doc

  

ArrayList的线程安全变体,其中包含所有可变操作   (添加,设置等)是通过制作新的副本来实现的   底层数组。

     

这通常成本太高,......

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

ConcurrentHashMap是否每次执行写入操作时都会创建基础数据结构的新副本?如果写操作多于读取操作,它会比Collections.synchronizedMap表现差吗?

4 个答案:

答案 0 :(得分:7)

不,ConcurrentHashMap不会制作基础数据结构的新副本。

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

答案 1 :(得分:1)

写入ConcurrentHashMap时。它只会在内部锁定Map的部分内容,因此通过这种行为,我们可以看到它不会制作新的副本,但会在同一个地方进行更改。副本。
因此,当我们尝试在ConcurrentHashMap中写入时,这意味着我们正在尝试在任何段中编写,然后它只是锁定该段以及仅更新该段。所以简单来说,它永远不会制作任何新的副本。所以你的问题的答案是 NO。

答案 2 :(得分:0)

ConcurrentHashMap几乎总是正确使用的,因为它具有更好的性能和更有用的API(您可以避免check-then-set线程问题)而不是其对应物 它使用 lock stripping 进行更细粒度的访问,并且不复制地图 您不应使用ConcurrentHashMap应用程序是您需要锁定地图以进行独占访问

答案 3 :(得分:0)

我发现的主要区别是ConcurrentHashMap中的自定义“并发级别”。 我们可以问JVM划分Map需要多少个块(段)。将创建许多锁。 CopyOnWriteArrayList使用简单的过程,即简单地创建一个克隆并对其进行更新。 (此名称稍后由JVM与原始arraylist合并。)