私はJava Concurrency in Practiceを経由しています。いくつかは私に次のようになり、リスト2.8のコードで私が午前、次の疑問を説明することができます: -読み取りを変数に同期させる必要がありますか?
@ThreadSafe
public class CachedFactorizer implements Servlet {
@GuardedBy("this") private BigInteger lastNumber;
@GuardedBy("this") private BigInteger[] lastFactors;
@GuardedBy("this") private long hits;
@GuardedBy("this") private long cacheHits;
public synchronized long getHits() { return hits; }
public synchronized double getCacheHitRatio() {
return (double) cacheHits/(double) hits;
}
public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = null;
synchronized (this) {
++hits;
if (i.equals(lastNumber)) {
++cacheHits;
factors = lastFactors.clone();
}
}
if (factors == null) {
factors = factor(i);
synchronized (this) {
lastNumber = i;
lastFactors = factors.clone();
}
}
encodeIntoResponse(resp, factors);
}
}
cacheHits
へのアップデートとhits
と同期する必要getCacheHitRatio
方法は同期ブロックからのものですgetCacheHitRatio
は値を読み取っているだけですか?- なぜ
clone
がlastFactors
とfactors
で使用されましたか?factors=lastFactors
は使えませんか?これはこの章では説明していません。
変数をvolatileにすることを検討してください。 –