您好,登錄后才能下訂單哦!
摘自<<JAVA并發編程實戰>>
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) { // 檢查是緩存中是否已經存在,如果沒有就創建 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) { // 如果緩存中原來沒有這個結果則執行任務計算結果 f = ft; ft.run(); } } try { return f.get(); // 阻塞,等待結果.如果已經在緩存中則不會阻塞 } catch(CancellationException e) { cache.remove(arg, f); } catch (Exception e) { e.printStackTrace(); } } } }
上述代碼有多方面好處
1:計算與緩存隔離,解偶
2:線程安全
3:支持并發
4:并發時不會重復計算,高效
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。