易失性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); } }