影子传说_Hades 2010-02-28 16:22
浏览 202
已采纳

这个cache是Immutable的但是否为线程安全的呢?

[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]

  • 写回答

2条回答

  • iteye_13500 2010-03-01 08:52
    关注

    [quote]那构造函数不存在被2个线程同时初始化的情况吗?我就是这里没看懂[/quote]

    这和immutable是两个不同的问题:在构造方法没有返回前,没有线程可以调用这个对象,所有构造函数是不需要同步的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了