我使用CopyOnWriteArrayList
非常多。
但是,我会在
时使用Collections.synchronizedList()
这是因为根据CopyOnWriteArrayList Java Doc
ArrayList的线程安全变体,其中包含所有可变操作 (添加,设置等)是通过制作新的副本来实现的 底层数组。
这通常成本太高,......
来到ConcurrentHashMap
时,我想知道在选择ConcurrentHashMap
而不是Collections.synchronizedMap()
时,我仍然可以应用相同的逻辑吗?
ConcurrentHashMap
是否每次执行写入操作时都会创建基础数据结构的新副本?如果写操作多于读取操作,它会比Collections.synchronizedMap表现差吗?
答案 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合并。)