ConcurrentHashMap融合了Hashtable和HashMap兩者的優點。java
Hashtable是作了線程同步,HashMap未考慮同步。因此HashMap在單線程下效率較高,Hashtable在多線程下同步操做能保證程序的正確性。 可是Hashtable每次執行同步操做都須要鎖住整個結構。數據庫
ConcurrentHashMap的出現就是爲了解決Hashtable同步lock整個數據結構的問題。ConcurrentHashMap鎖的方式是細顆粒度。緩存
ConcurrentHashMap將Hash表分爲16個桶(默認值),諸如get/put/remove操做只須要鎖着須要的單個桶便可。數據結構
ConcurrentHashMap只有在size等操做的時候纔會鎖住整個Hash表。多線程
下面是本身實現的一個ConcurrentHashMap的本地緩存的例子:ConcurrentHashMap 和Guava cache相比,須要本身顯示的刪除緩存post
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)); } }