一個簡單的測試類,如果在高並發下會有問題麼
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<Object,Object> cacheMap = new ConcurrentHashMap<Object,Object>();//緩存容器
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<Object,Object> 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();
}
}
高並發需要考慮伸縮性,也就是多個服務器同時處理,那麼需要進程之前的數據同步,而不是僅僅同步線程。你的程序沒有什麼實際的作用哦。