, sayfa 106, bu Memoizer3
sorunun [iki konu boş görerek ve pahalı hesaplama başlangıç] bir bileşik eylem (koyun-if-devamsızlık) arka harita üzerinde gerçekleştirilir çünkü karşı savunmasız olduğunu "söylüyor olamaz kilitleme kullanılarak atomik yapılmalıdır. " Neden kilitlemeyi kullanarak atom yapamadığını söylediklerini anlamıyorum. İşte orjinal kod:Neden Java Concurrency Uygulama Davranışları 5.18'de atomik kilitli olarak yapılıyor?
Neden böyle bir şey işe yaramaz? Tabii
...
public V compute(final A arg) throws InterruptedException {
Future<V> f = null;
FutureTask<V> ft = null;
synchronized(this){
f = cache.get(arg);
if (f == null) {
Callable<V> eval = new Callable<V>() {
public V call() throws InterruptedException {
return c.compute(arg);
}
};
ft = new FutureTask<V>(eval);
f = ft;
cache.put(arg, ft);
}
}
if (f==ft) ft.run(); // call to c.compute happens here
...
Evet, yazarlar metinde bir putIfAbsent çözümü verir. – PeteyPabPro