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)); } }