ConcurrentHashMap和Collections.synchronizedMap(Map)有什么区别?
我有一个地图,该地图将同时被多个线程修改。
Java API中似乎有三种不同的同步Map实现:
- Hashtable
- Collections.synchronizedMap(Map)
- ConcurrentHashMap
据我了解,这Hashtable
是一个旧的实现(扩展了过时的Dictionary
类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。
但是其他两个呢?Collections.synchronizedMap(Map)
和ConcurrentHashMaps
返回的Map之间有什么区别?哪一种适合哪种情况?
-
为您的需要使用
ConcurrentHashMap
。它允许从多个线程并发修改Map,而无需阻止它们。Collections.synchronizedMap(map)
创建一个阻塞映射,这会降低性能,尽管会确保一致性(如果使用正确)。如果需要确保数据一致性,并且每个线程都需要具有最新的地图视图,请使用第二个选项。如果性能至关重要,请使用第一个,并且每个线程仅将数据插入到映射中,而读取的频率则较低。
-
╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗ ║ Property ║ HashMap ║ Hashtable ║ ConcurrentHashMap ║ ╠═══════════════╬═══════════════════╬═══════════════════╩═════════════════════╣ ║ Null ║ allowed ║ not allowed ║ ║ values/keys ║ ║ ║ ╠═══════════════╬═══════════════════╬═════════════════════════════════════════╣ ║ Thread-safety ║ ║ ║ ║ features ║ no ║ yes ║ ╠═══════════════╬═══════════════════╬═══════════════════╦═════════════════════╣ ║ Lock ║ not ║ locks the whole ║ locks the portion ║ ║ mechanism ║ applicable ║ map ║ ║ ╠═══════════════╬═══════════════════╩═══════════════════╬═════════════════════╣ ║ Iterator ║ fail-fast ║ weakly consistent ║ ╚═══════════════╩═══════════════════════════════════════╩═════════════════════╝
关于锁定机制:
Hashtable
锁定对象,而仅ConcurrentHashMap
锁定存储桶。
-
ConcurrentHashMap 和 Collections.synchronizedMap(Map) 有什么区别?
2022-03-22 关注 0 浏览86 1答案
-
Hashtable和Collections.synchronizedMap(HashMap)之间的区别
2021-01-30 关注 0 浏览96 1答案
-
Collection 和 Collections 有什么区别?
2020-01-08 关注 0 浏览1109 1答案
-
Collections.emptyList()和Collections.EMPTY_LIST有什么区别
2021-01-30 关注 0 浏览77 1答案
-
Collection和Collections有什么区别
2021-12-25 关注 0 浏览75 1答案
-
Collection 和 Collections 有什么区别?
2021-09-18 关注 0 浏览119 1答案
-
Collection 和 Collections 有什么区别?
2021-09-17 关注 0 浏览177 1答案
-
map里面[]和 at 有什么区别
2022-09-21 关注 0 浏览14 0答案
-
Map和WeakMap有什么区别?
2021-01-11 关注 0 浏览224 0答案
-
map和forEach有什么区别?
2021-01-11 关注 0 浏览200 0答案