java'的优势;ConcurrentHashMap是否为仅获取映射?

java'的优势;ConcurrentHashMap是否为仅获取映射?,java,hashmap,concurrenthashmap,Java,Hashmap,Concurrenthashmap,考虑以下两种情况: 您将在开始时填充一次的映射,然后将从许多不同的线程访问该映射 要用作缓存的映射,将从多个不同线程访问该映射。您希望避免计算将存储在映射中的结果,除非它丢失,否则get computation store块将被同步。(地图将不会以其他方式使用) 在这两种情况下,ConcurrentHashMap是否为您提供了普通HashMap之外的线程安全性 在第一种情况下,这在实践中应该无关紧要,但不能保证写入常规hashmap的修改会被其他线程看到。因此,如果一个线程最初创建并填充映射,而

考虑以下两种情况:

  • 您将在开始时填充一次的映射,然后将从许多不同的线程访问该映射
  • 要用作缓存的映射,将从多个不同线程访问该映射。您希望避免计算将存储在映射中的结果,除非它丢失,否则get computation store块将被同步。(地图将不会以其他方式使用)

  • 在这两种情况下,
    ConcurrentHashMap
    是否为您提供了普通
    HashMap
    之外的线程安全性

    在第一种情况下,这在实践中应该无关紧要,但不能保证写入常规hashmap的修改会被其他线程看到。因此,如果一个线程最初创建并填充映射,而该线程从未与其他线程同步,那么这些线程可能永远看不到映射中设置的初始值

    上述情况在实践中不太可能发生,只需要一个同步事件,或者在线程之间保证之前发生(例如读/写易失性变量),以确保理论上的正确性


    在第二种情况下,存在一个问题,因为访问从结构上修改它的HashMap(添加值)需要同步。此外,您需要某种类型的同步来建立与其他线程的“先发生后共享”关系/共享可见性,否则无法保证其他线程将看到您输入的新值。ConcurrentHashMap提供了这些保证,当一个线程在结构上修改它时,它不会中断。

    线程安全性没有区别,不会。对于场景2,在性能上有区别,在时间保证上有一点区别

    您的场景#2没有同步,因此希望使用缓存的线程不必排队等待其他线程完成。然而,为了获得这一好处,您不必在同步边界处的关系之前发生困难,因此两个线程可能会在同一时间或多或少地计算相同的缓存值。只要计算是可重复的,这通常是无害的


    (还有一点细微的区别,ConcurrentHashMap不允许将
    null
    用作键。)

    请在我自己的帖子中发表评论,对于您的情况,使用写时拷贝映射实现(我相信Apache有一个实现)可以获得最佳性能。对于很多读操作和很少的写操作,它的性能应该超过ConcurrentHashMap(但我还没有对此进行测试)。