如果有ConcurrentHashMap,java为什么需要synchronizedMap()?
我读了一篇关于线程安全地图的文章,有一个问题Collections.synchronizedMap()
通过在每个方法上添加synchronized
块来代理基础映射。另一方面ConcurrentHashMap
不会在读/写操作中锁定整个映射。这意味着多线程系统中的所有操作都更快
那么现在使用synchronizedMap()
有什么好处呢?我只看到:
- 它从Java1.2开始提供(相对于Java1.5的
ConcurrentHashMap
) - 可以存储可为空的值(如果基础映射可以)
还有其他情况下synchronizedMap()
更好吗
# 1 楼答案
与
Collections.synchronizedMap(map)
和ConcurrentHashMap
都有利弊synchronizedMap
在需要数据一致性时非常有用。每个访问线程都会有一个映射的更新视图,这是通过阻止映射来实现的,这反过来会降低它的性能ConcurrentHashMap
在需要频繁修改map
时非常有用。由于它处理map
的分段/分区,所以几个线程同时处理它。但访问线程可能没有地图的更新视图。另一个优点是它是fail-safe
ConcurrentHashMap
不允许空键或值使用
ConcurrentHashMap
如果性能问题严重,则使用数据一致性# 2 楼答案
我可以借助互斥与信号量的对比来翻译这个
与任何互斥体一样,synchronizedMap一次只允许一个线程访问备份映射。这确保了没有其他线程能够从映射中读取/写入条目
对于ConcurrentHashMap,就像信号量一样,我们决定一个并发级别,即一次有多少个线程可以实际进入并查看映射中的条目
对何时使用互斥和何时使用信号量的研究可以帮助你进一步澄清你的疑问