易失性HashMap与ConcurrentHashMap

我有一个缓存类,其中包含一个用于存储缓存项的volatile HashMap

我很好奇将volatile HashMap更改为ConcurrentHashMap的后果是什么?

我会获得性能提升吗? 此缓存是只读缓存。

什么是最好的选择? 只是HashMap? 缓存正在一段时间内填充。

首先,您似乎无法理解volatile关键字的作用。 它确保如果声明为volatile的变量保存的引用值发生更改,则其他线程将看到它而不是具有缓存副本。 它与访问HashMap线程安全无关

鉴于此,以及你说HashMap是只读的事实……你当然不需要使用提供线程安全的任何东西,包括ConcurrentHashMap

编辑添加:您现在的最后一次编辑说“缓存正在一段时间内填充”

那不是只读的,不是吗?

如果您在编写时更新线程(更新现有的HashMap),那么您应该使用ConcurrentHashMap ,是的。

如果要填充全新的HashMap然后将其分配给现有变量,则使用volatile

你说缓存是只读的,但也会在一个似乎相互矛盾的时间间隔内更新。

如果整个缓存按间隔更新,我会继续使用volatile。 volatile将确保更新的地图安全发布。

 public final class Cache { private volatile Map cache; private void mapUpdate() { Map newCache = new HashMap<>(); // populate the map // update the reference with an immutable collection cache = Collections.unmodifiableMap(newCache); } } 

如果间隔更新正在修改同一缓存,那么您可能希望使用ConcurrentHashMap,或复制映射,更新副本并更新引用。

 public final class Cache { private volatile Map cache; private void mapUpdate() { Map newCache = new HashMap<>(cache); // update the map // update the reference with an immutable collection cache = Collections.unmodifiableMap(newCache); } }