如果有ConcurrentHashMap,为什么需要synchronizedMap()?

时间:2017-03-30 09:14:16

标签: java multithreading java.util.concurrent

我读了一篇关于线程安全地图的文章并得到了一个问题。 Collections.synchronizedMap()代理基础地图,在每个方法上添加synchronized块。另一方面,ConcurrentHashMap不会在读/写操作上锁定整个映射。这意味着多线程系统中的所有操作都更快。

那么现在使用synchronizedMap()有什么好处?我看到唯一:

  1. 自java 1.2起可用(对于ConcurrentHashMap的java 1.5)
  2. 可以存储可以为空的值(如果基础地图可以这样做)
  3. synchronizedMap()更好的时候还有其他情况吗?

4 个答案:

答案 0 :(得分:1)

不是真的。我能想到的唯一另一种情况是轻松使自定义地图实现线程安全。

答案 1 :(得分:1)

Collections.synchronizedMap(map)ConcurrentHashMap都有利弊。

当您想要数据一致性时,

synchronizedMap非常有用。每个访问线程都有一个地图的更新视图,这是通过阻止地图来实现的,这反过来会降低它的性能。

当您需要经常修改ConcurrentHashMap时,

map非常有用。因为它适用于map几个线程的分段/分区同时工作。但是访问线程可能没有map的更新视图。其他优点是它是fail-safe ConcurrentHashMap不允许空键或值。

如果性能高度关注数据一致性,请使用ConcurrentHashMap

答案 2 :(得分:0)

来自ConcurrentHashMap文档:

  

" ...没有任何支持以某种方式锁定整个表格   这会阻止所有访问"

当迭代ConcurrentHashMap元素时,您可能会看到其他线程同时完成更新。如果要阻止此类更新,可以使用Collections.synchronizedMap()代替并将迭代逻辑放在synchronized(map)块中。

答案 3 :(得分:-1)

我可以借助Mutex与信号量的神学来翻译它。

就像任何Mutex一样,synchronizedMap一次只允许一个线程访问支持映射。这可以确保没有其他线程能够从地图读取/写入条目。

对于ConcurrentHashMap,就像信号量一样,我们决定一个并发级别,即一次有多少个线程可以实际查看并查看Map中的条目。

关于何时使用互斥锁以及何时使用信号量的研究可以帮助您进一步明确疑虑。