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

发布于 2021-02-02 23:00:33

我有一个地图,该地图将同时被多个线程修改。

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

  • Hashtable
  • Collections.synchronizedMap(Map)
  • ConcurrentHashMap

据我了解,这Hashtable是一个旧的实现(扩展了过时的Dictionary类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。

但是其他两个呢?Collections.synchronizedMap(Map)ConcurrentHashMaps 返回的Map之间有什么区别?哪一种适合哪种情况?

关注者
0
被浏览
117
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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

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



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。
    ╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗
    ║   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锁定存储桶。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看