[英]Volatile HashMap vs ConcurrentHashMap
我有一個緩存類,其中包含一個用於存儲緩存項的volatile HashMap<T>
。
我很好奇將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);
}
}
我的Web應用程序有一個類似的用例。 我正在使用HAshMap進行內存緩存。 用例如下 -
我想確保兩個線程同時在add上執行一個而另一個在remove方法上,這種方法會確保他們在他們看到緩存中的最新數據嗎? 如果我沒有錯,那么同步方法負責線程安全,因為volatile負責可見性。
private volatile HashMap<String,String> activeRequests = new HashMap<String,String>();
public synchronized boolean add(String pageKey, String space, String pageName) {
if (!(activeRequests.get(pageKey) == null)) {
return false;
}
activeRequests.put(pageKey, space + ":" + pageName);
return true;
}
public synchronized void remove(String pageKey) {
if(!(activeRequests.get(pageKey) == null))
activeRequests.remove(pageKey);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.