溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

構建高效可申縮的結果緩存

發(fā)布時間:2020-07-12 14:57:37 來源:網絡 閱讀:243 作者:張濤澤 欄目:網絡安全

摘自<<JAVA并發(fā)編程實戰(zhàn)>>

public interface Computable<A, V> {
    V comput(A arg);
}

構建高效可申縮的結果緩存

import java.util.concurrent.*;/**
 * 構建高效可申縮的結果緩存
 * <p>
 * author: shiruiqiang
 * time: 31/01/2017 23:11
 **/public class Memoizer<A, V> implements Computable<A, V>{    private final ConcurrentHashMap<A, Future<V>> cache = new ConcurrentHashMap<A, Future<V>>();    private Computable<A, V> c;    public Memoizer(Computable c) {        this.c = c;
    }    public V comput(A arg) {        while(true) {
            Future<V> f = cache.get(arg);            if (f == null) { // 檢查是緩存中是否已經存在,如果沒有就創(chuàng)建
                Callable<V> task = new Callable<V>() {
                    @Override                    public V call() throws Exception {                        return c.comput(arg);
                    }
                };
                FutureTask<V> ft = new FutureTask(task);
                f = cache.putIfAbsent(arg, ft); // 原子操作,不會重復計算                if (f == null) { // 如果緩存中原來沒有這個結果則執(zhí)行任務計算結果
                    f = ft;
                    ft.run();
                }
            }            try {
                return f.get(); // 阻塞,等待結果.如果已經在緩存中則不會阻塞
            } catch(CancellationException e) {
                cache.remove(arg, f);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

構建高效可申縮的結果緩存

上述代碼有多方面好處

1:計算與緩存隔離,解偶

2:線程安全

3:支持并發(fā)

4:并發(fā)時不會重復計算,高效


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI