问题描述
- 最近学习java的缓存机制,请大家看看我的代码有什么不足
- 一个简单的测试类,如果在高并发下会有问题么
package com.test.cache;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class CacheManager { private volatile static CacheManager cacheManager;//缓存类的实例 private long upDataTime;//最后一次更新的时间 private static Map<ObjectObject> cacheMap = new ConcurrentHashMap<ObjectObject>();//缓存容器 private boolean upDataStatus;//缓存状态true为正在更新,false为更新完毕 private CacheManager(){ upDataTime = System.currentTimeMillis(); } /** * 初始化,保证单例 * @return */ public static CacheManager getInstance(){ if(cacheManager == null){ synchronized(CacheManager.class){ if(cacheManager == null){ cacheManager = new CacheManager(); } } } return cacheManager; } /** * 载入数据 */ public void loadAllCache(){ upDataStatus = true; /*****************************/ //模拟从数据库取数据,放入map cacheMap.put(""1"" 1); cacheMap.put(""2"" 2); cacheMap.put(""3"" 3); cacheMap.put(""4"" 4); /*****************************/ upDataStatus = false; } /** * 返回缓存 * @return */ public Map<ObjectObject> getCache(){ long currentTime = System.currentTimeMillis(); boolean isTimeOut = isTimeOut(currentTime); if(upDataStatus){ System.out.println(""当前缓存正在更新,不可取值""); return null; } if(isTimeOut){ System.out.println(""当前缓存已超时,正在重新获取""); this.upDataTime = System.currentTimeMillis(); this.reloadCache();//重新获取 } return cacheMap; } /** * 判断是否超时 * @param currentTime * @return */ private boolean isTimeOut(long currentTime){ return (currentTime-this.upDataTime > 100000 ? true :false); } /** * 重新载入缓存 */ private void reloadCache(){ this.cacheMap.clear(); this.loadAllCache(); }}
解决方案
高并发需要考虑伸缩性,也就是多个服务器同时处理,那么需要进程之前的数据同步,而不是仅仅同步线程。你的程序没有什么实际的作用哦。
时间: 2024-10-02 10:33:03