a72880526 2016-04-13 11:49 采纳率: 0%
浏览 1715

java并发多线程 关于final和Volatile 的问题

@Immutable
class OneValueCache {
private final BigInteger lastNumber;
private final BigInteger[] lastFactors;

/**

  • 如果在构造函数中没有使用 Arrays.copyOf()方法,那么域内不可变对象 lastFactors却能被域外代码改变
  • 那么 OneValueCache 就不是不可变的。
    */
    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);
    }
    }

@ThreadSafe
public class VolatileCachedFactorizer implements Servlet {
private volatile OneValueCache cache =
new OneValueCache(null, null);

public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = cache.getFactors(i);
if (factors == null) {
factors = factor(i);
cache = new OneValueCache(i, factors);//声明为 volatile ,防止指令重排序,保证可见性
}
encodeIntoResponse(resp, factors);
}
}

上面两段程序是在java并发编程中看到的。没有看明白为什么必须使用final和Volatile 这两个关键字才可以保证不使用锁他也是安全的。
能不能有大神能够说一下,假如不使用final,只使用Volatile 他会发生的不安全情况,与都使用了这两个关键字的对比。
谢谢了。万分感谢,看了一晚上。
下面就是我对两个关键字的理解:
Volatile 就是本地内存不存这个变量,直接在主内存中就行读写
final修饰变量就是这个变量是不可改变的,如果是引用类型就表示一直会引用初始化那个地址的数据,如果是基本类型,就是不能修改这个类型的值

如果不正确请指证一下

  • 写回答

2条回答 默认 最新

  • a72880526 2016-04-13 14:08
    关注

    再提一个问:
    事实不可变对象为什么需要通过安全方式来发布才能确保可见性
    既然他在构造完成了过后就没有其他操作来修改他了,为什么他需要安全方式来发布呢。不是应该跟不可变对象一样就行了么

    评论

报告相同问题?

悬赏问题

  • ¥15 有卷积神经网络识别害虫的项目吗
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件