考虑到在使用HashMap在并发时会出现不正确行为,根据网上资料自己编写了采用ConcurrentHashMap来完成静态缓存的处理,目的是为了能够用来处理高并发的线程安全类
package com.zengms.cache; import java.util.Map; import Java.util.concurrent.ConcurrentHashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class MapCacheManager { private final static Log log = LogFactory.getLog(MapCacheManager.class); private volatile long updateTime = 0L;// 更新缓存时记录的时间 private volatile boolean updateFlag = true;// 正在更新时的阀门,为false时表示当前没有更新缓存,为true时表示当前正在更新缓存 private volatile static MapCacheManager mapCacheObject;// 缓存实例对象 private static Map<String, String> cacheMap = new ConcurrentHashMap<String, String>();// 缓存容器 private MapCacheManager() { this.LoadCache();// 加载缓存 updateTime = System.currentTimeMillis();// 缓存更新时间 } /** * 采用单例模式获取缓存对象实例 * * @return */ public static MapCacheManager getInstance() { if (null == mapCacheObject) { synchronized (MapCacheManager.class) { if (null == mapCacheObject) { mapCacheObject = new MapCacheManager(); } } } return mapCacheObject; } /** * 装载缓存 */ private void LoadCache() { this.updateFlag = true;// 正在更新 /********** 数据处理,将数据放入cacheMap缓存中 **begin ******/ cacheMap.put("key1", "value1"); cacheMap.put("key2", "value2"); cacheMap.put("key3", "value3"); cacheMap.put("key4", "value4"); cacheMap.put("key5", "value5"); /********** 数据处理,将数据放入cacheMap缓存中 ***end *******/ this.updateFlag = false;// 更新已完成 } /** * 返回缓存对象 * * @return */ public Map<String, String> getMapCache() { long currentTime = System.currentTimeMillis(); if (this.updateFlag) {// 前缓存正在更新 log.info("cache is Instance ....."); return null; } if (this.IsTimeOut(currentTime)) {// 如果当前缓存正在更新或者缓存超出时限,需重新加载 synchronized (this) { this.ReLoadCache(); this.updateTime = currentTime; } } return this.cacheMap; } private boolean IsTimeOut(long currentTime) { return ((currentTime - this.updateTime) > 1000000);// 超过时限,超时 } /** * 获取缓存项大小 * @return */ private int getCacheSize() { return cacheMap.size(); } /** * 获取更新时间 * @return */ private long getUpdateTime() { return this.updateTime; } /** * 获取更新标志 * @return */ private boolean getUpdateFlag() { return this.updateFlag; } /** * 重新装载 */ private void ReLoadCache() { this.cacheMap.clear(); this.LoadCache(); } }
测试代码:
package com.zengms.cache; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class CacheTest { public static void main(String[] args) { MapCacheManager cache = MapCacheManager.getInstance(); Map<String, String> cacheMap = new ConcurrentHashMap<String, String>(); cacheMap = cache.getMapCache(); Set<String> set = cacheMap.keySet(); Iterator<String> it = set.iterator(); while(it.hasNext()){ String key = it.next(); System.out.println(key+"="+cacheMap.get(key)); } } }