ConcurrentHashMap實現緩存


  ConcurrentHashMap融合了Hashtable和HashMap二者的優勢。

  Hashtable是做了線程同步,HashMap未考慮同步。所以HashMap在單線程下效率較高,Hashtable在多線程下同步操作能保證程序的正確性。  但是Hashtable每次執行同步操作都需要鎖住整個結構。

  

  ConcurrentHashMap的出現就是為了解決Hashtable同步lock整個數據結構的問題。ConcurrentHashMap鎖的方式是細顆粒度。

  ConcurrentHashMap將Hash表分為16個桶(默認值),諸如get/put/remove操作只需要鎖着需要的單個桶即可。

    ConcurrentHashMap只有在size等操作的時候才會鎖住整個Hash表。

  下面是自己實現的一個ConcurrentHashMap的本地緩存的例子:ConcurrentHashMap 和Guava cache相比,需要自己顯示的刪除緩存

復制代碼
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapTest {

    private static ConcurrentHashMap<String, String> cacheMap = new ConcurrentHashMap<>();

    /**
     * 獲取緩存的對象
     * 
     * @param account
     * @return
     */
    public static String getCache(String account) {

        account = getCacheKey(account);
        // 如果緩沖中有該賬號,則返回value
        if (cacheMap.containsKey(account)) {
            return cacheMap.get(account);
        }
        // 如果緩存中沒有該賬號,把該帳號對象緩存到concurrentHashMap中
        initCache(account);
        return cacheMap.get(account);
    }

    /**
     * 初始化緩存
     * 
     * @param account
     */
    private static void initCache(String account) {
        // 一般是進行數據庫查詢,將查詢的結果進行緩存
        cacheMap.put(account, "18013093863");
    }

    /**
     * 拼接一個緩存key
     * 
     * @param account
     * @return
     */
    private static String getCacheKey(String account) {
        return Thread.currentThread().getId() + "-" + account;
    }

    /**
     * 移除緩存信息
     * 
     * @param account
     */
    public static void removeCache(String account) {
        cacheMap.remove(getCacheKey(account));
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM