簡體   English   中英

易失性HashMap與ConcurrentHashMap

[英]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進行內存緩存。 用例如下 -

  1. 一個用戶請求進入並首先使用輸入密鑰檢查緩存是否存在記錄。 這是在add方法中完成的。
  2. 如果該對象不存在,則將新記錄插入緩存中。
  3. 類似地,在remove方法中,首先使用密鑰檢查緩存中是否存在記錄,如果找到則只刪除它。

我想確保兩個線程同時在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM