public class CacheTimerHandler { html
private static final long SECOND_TIME = 1000;//默認過時時間 20秒 java
private static final int DEFUALT_VALIDITY_TIME = 20;//默認過時時間 20秒 緩存
private static final Timer timer ; ide
private static final SimpleConcurrentMap<String, CacheEntity> map; 性能
static{ this
timer = new Timer(); spa
map = new SimpleConcurrentMap<String, CacheEntity>(new HashMap<String, CacheEntity>(1<<18)); .net
} 線程
/** htm
* 增長緩存對象
* @param key
* @param ce
*/
public static void addCache(String key, CacheEntity ce){
addCache(key, ce, DEFUALT_VALIDITY_TIME);
}
/**
* 增長緩存對象
* @param key
* @param ce
* @param validityTime 有效時間
*/
public static synchronized void addCache(String key, CacheEntity ce, int validityTime){
map.put(key, ce);
//添加過時定時
timer.schedule(new TimeoutTimerTask(key), validityTime * SECOND_TIME);
}
/**
* 獲取緩存對象
* @param key
* @return
*/
public static synchronized CacheEntity getCache(String key){
return map.get(key);
}
/**
* 檢查是否含有制定key的緩衝
* @param key
* @return
*/
public static synchronized boolean isConcurrent(String key){
return map.containsKey(key);
}
/**
* 刪除緩存
* @param key
*/
public static synchronized void removeCache(String key){
map.remove(key);
}
/**
* 獲取緩存大小
* @param key
*/
public static int getCacheSize(){
return map.size();
}
/**
* 清除所有緩存
*/
public static synchronized void clearCache(){
if(null != timer){
timer.cancel();
}
map.clear();
System.out.println("clear cache");
}
static class TimeoutTimerTask extends TimerTask{
private String ceKey ;
public TimeoutTimerTask(String key){
this.ceKey = key;
}
@Override
public void run() {
CacheTimerHandler.removeCache(ceKey);
System.out.println("remove : "+ceKey);
}
}
}
timer方式有點是適用性更強,由於每一個緩存的過時時間均可以獨立配置的;ist只能適用 於緩存時間都同樣的線性過時。從性能開銷方面,由於timer是與緩存對象數量成正比的,在緩存量很大的時候,在緩存時間內系統開銷也隨之提升;而 list方式只要一個線程管理過時清理就能夠了。ReadWriteLock 請參考http://www.blogjava.net/xylz/archive/2010/07/14/326080.html
在這裏程序還有更好的方式來實現
使用FutureTask來獲取任務,這樣避免了每次執行相同計算工做,例如
一個線程在執行map.put(5),此時第二個線程也是執行map.put(5),或者執行一系列的計算,目的是get(5)這個操做,但是這個操做已經在進行了,如今咱們須要一種先進行判斷的模式,先判斷是否有線程正在執行這個操做,若是有咱們就不在執行,這樣能夠避免重覆的開銷,有線程在執行這個操做那就繼續等待其執行完,而不用再去執行一次