搬磚自<Java并發(fā)編程>
private final Map<A,Future<V>> cache = new ConcurrentHashMap<>();
private final Computable<A,V> c;
public Memoizer4(Computable c) {
this.c = c;
}
@Override
public V compute(A arg) throws InterruptedException {
Future<V> result = cache.get(arg);
if (result == null) {
Callable<V> eval = new Callable<V>() {
@Override
public V call() throws Exception {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<>(eval);
result = ft;
cache.putIfAbsent(arg, result);
ft.run();
}
try {
V ret = result.get();
return ret;
} catch(Exception ex) {
ex.printStackTrace();
throw new InterruptedException(ex.getMessage());
}
}
- FutureTask extends Runnable, Callable
- result.get 會(huì)阻塞等待結(jié)果
- cache.putIfAbsent(); 沒有則添加绞愚,避免多線程下面可能引發(fā)的問題.
- ConcurrentHashMap的鎖機(jī)制是針對(duì)Node節(jié)點(diǎn)
- Collections.synchronizedMaps()的鎖是對(duì)象鎖.并發(fā)性的話ConcurrentHashMap要好很多!
- Collections.synchronizedMaps遍歷時(shí)需加對(duì)象鎖,否則會(huì)報(bào)ConcurrentXXX錯(cuò)誤.
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者