Java学习之ConcurrentHashMap实现一个本地缓存

 

  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));
    }
}
相关文章
相关标签/搜索