次のコード ( Java Concurrency in Practice Chapter 2、セクション 2.5、リスト 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(); // questionable line here
}
}
if (factors == null) {
factors = factor(i);
synchronized (this) {
lastNumber = i;
lastFactors = factors.clone(); // and here
}
}
encodeIntoResponse(resp, factors);
}
}
factors
、lastFactors
配列が複製されるのはなぜですか? factors = lastFactors;
と簡単に書けませんlastFactors = factors;
か?factors
がローカル変数であり、それが に渡されるという理由だけでencodeIntoResponse
、それを変更できますか?
質問が明確であることを願っています。ありがとう。