java的ConcurrentHashMap对于get-only映射的优势?

时间:2011-12-21 22:55:08

标签: java hashmap concurrenthashmap

考虑以下两种情况:

  1. 您将在开始时填充一次的地图,然后将从许多不同的线程访问。
  2. 您将用作缓存的地图,可以从许多不同的线程访问。您希望避免计算将存储在地图中的结果,除非它丢失,get-computation-store块将被同步。 (并且不会使用地图)
  3. 在其中任何一种情况下,ConcurrentHashMap是否为普通HashMap以上的线程安全提供了额外的帮助?

2 个答案:

答案 0 :(得分:0)

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

上述情况在实践中不太可能,并且只会发生单个同步事件或发生在线程之间的保证之前(例如读/写volatile变量),以确保理论上的正确性。

在第二种情况下,由于访问HashMap在结构上修改它(添加值)需要同步,因此存在一个问题。此外,您需要某种类型的同步来与其他线程建立发生在之前的关系/共享可见性,或者无法保证其他线程将看到您放入的新值.ConcurrentHashMap提供了这些保证,并且在一个时不会中断线程在结构上修改它。

答案 1 :(得分:0)

线程安全没有区别,没有。对于场景#2,性能存在差异,时序保证差异很小。

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

(ConcurrentHashMap不允许将null用作密钥,这也略有不同。)