ConcurrentHashMap和Collections.synchronizedMap(Map)有什么区别?

2022-08-31 04:11:06

我有一个Map,它将由几个线程同时修改。

Java API 中似乎有三种不同的同步 Map 实现:

  • Hashtable
  • Collections.synchronizedMap(Map)
  • ConcurrentHashMap

据我所知,这是一个旧的实现(扩展过时的类),后来进行了调整以适应接口。虽然它是同步的,但它似乎存在严重的可伸缩性问题,并且不鼓励用于新项目。HashtableDictionaryMap

但是另外两个呢?返回的地图 和 返回的地图之间有什么区别?哪一个适合哪种情况?Collections.synchronizedMap(Map)ConcurrentHashMap


答案 1

根据您的需要,请使用 .它允许从多个线程并发修改 Map,而无需阻止它们。 创建一个阻塞映射,这将降低性能,尽管确保一致性(如果使用得当)。ConcurrentHashMapCollections.synchronizedMap(map)

如果需要确保数据一致性,并且每个线程都需要具有映射的最新视图,请使用第二个选项。如果性能至关重要,并且每个线程仅将数据插入映射,则使用第一个,读取发生频率较低。


答案 2
╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗
║   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   ║ 
╚═══════════════╩═══════════════════════════════════════╩═════════════════════╝

关于锁定机制:锁定对象,而仅锁定桶HashtableConcurrentHashMap


推荐