在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java怎么實(shí)現(xiàn)定時(shí)任務(wù)的刷新重置?

java怎么實(shí)現(xiàn)定時(shí)任務(wù)的刷新重置?

比如我要用Map做一個(gè)簡(jiǎn)單的臨時(shí)緩存, 然后在數(shù)據(jù)存進(jìn)去之后的一分鐘后刪掉該數(shù)據(jù)(因?yàn)閿?shù)據(jù)的讀寫比較要求時(shí)效性但又只會(huì)集中在一段時(shí)間內(nèi)去訪問, 所以不太想用定時(shí)任務(wù)去定期清理整個(gè)Map).
我一開始這樣寫的:

public Object put(final String key, Object value) {
   if (key == null || value == null) {
        return null;
    }
    cache.put(key, value);
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            removeData(key);
            this.cancel();
        }
    }, DEFAULT_TIMEOUT);
    return value;
}

但這樣就會(huì)存在這樣一個(gè)問題: 在第一次存入數(shù)據(jù)的接近一分鐘時(shí)又更新了一下這條數(shù)據(jù), 結(jié)果在一分鐘到的時(shí)候這條數(shù)據(jù)又馬上就被刪掉了, 有點(diǎn)不符合要求, 這要怎么解決?

回答
編輯回答
憶當(dāng)年

強(qiáng)烈建議用現(xiàn)成的緩存庫(例如 guava cache),因?yàn)樗鼈兊氖褂枚己芎?jiǎn)單。你自己寫會(huì)碰到兩個(gè)問題:

  1. 如何避免某些已過期的 key 依然存在于緩存中導(dǎo)致內(nèi)存泄漏?
  2. 如何使多線程訪問效率最大化?

看你的問題中的代碼,使用了 Timer 來指定一個(gè)刪除 key 的時(shí)間,但是 Timer 的實(shí)現(xiàn)是將其放到一個(gè)隊(duì)列里,然后單線程遍歷這個(gè)隊(duì)列。想下如果 Cache 里面放入上百萬的 key,那么這個(gè)隊(duì)列該多長(zhǎng),執(zhí)行效率該多低。

回到你的問題本身,你面臨的問題是緩存項(xiàng)的超時(shí)時(shí)間不是固定的,而是會(huì)隨著每次被訪問而推遲,所以不再適合用 Timer 清除。

2018年5月11日 03:19