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
的唯一应用程序是当您需要锁定地图以进行独占访问时 。
上一篇: Is ConcurrentHashMap analogy to CopyOnWriteArrayList
下一篇: Why do I need to override the equals and hashCode methods in Java?