[code="java"]
import java.math.BigInteger;
import java.util.Arrays;
public class OneValueCache {
private final BigInteger lastNumber;
private final BigInteger[] lastFactors;
// 构造函数
public OneValueCache(BigInteger i, BigInteger[] factors) {
lastNumber = i;
lastFactors = Arrays.copyOf(factors, factors.length);
}
// 没有直接给出保持对象的引用
public BigInteger[] getFactors(BigInteger i) {
if (lastNumber == null || !lastNumber.equals(i))
return null;
else
return Arrays.copyOf(lastFactors, lastFactors.length);
}
}
[/code]
[code="java"]
import java.math.BigInteger;
public class VolatileCachedFactorizer {
private volatile OneValueCache cache = new OneValueCache(null, null);
public void consume(BigInteger i) {
BigInteger[] factors = cache.getFactors(i);
if (factors == null) {
factors = factor(i);
//这个地方初始化cache,是否线程安全?
cache = new OneValueCache(i, factors);
}
System.out.println(factors);
}
private BigInteger[] factor(BigInteger i) {
BigInteger[] factors = { i, i.add(i) };
return factors;
}
}
[/code]