我读了一篇关于线程安全地图的文章并得到了一个问题。 Collections.synchronizedMap()
代理基础地图,在每个方法上添加synchronized
块。另一方面,ConcurrentHashMap
不会在读/写操作上锁定整个映射。这意味着多线程系统中的所有操作都更快。
那么现在使用synchronizedMap()
有什么好处?我看到唯一:
ConcurrentHashMap
的java 1.5) synchronizedMap()
更好的时候还有其他情况吗?
答案 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中的条目。
关于何时使用互斥锁以及何时使用信号量的研究可以帮助您进一步明确疑虑。