账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    final插入的StoreStore内存屏障为什么和volatile的作用不太一样?
    40
    0

    前提:
    在看《Java并发编程的艺术》的volatile一节时,有这样一句话:

    StoreStore屏障可以保证在volatile写之前,其前面所有普通写操作已经对任意处理器可见了。

    场景:

    public class FinalExample{
        int i;
        final int j;
        public FinalExample(){
            i = 1;
            j = 2;  //JMM会在final写 后面加上StoreStore内存屏障
        }
    }

    问题:
    为什么同样是插入StoreStore屏障,排在StoreStore前面的变量i 仍然有可能被重排序到构造函数外面,无法对其他线程可见?而前提里的volatile却可以?

    以下为个人猜想,但是不太确定:
    编译器在遇到volatile关键字时,会保证volatile写前面的普通写已经完成并对其他线程可见(不会发生编译器重排序)。而final没有编译器的保证,所以会发生编译器重排序。

    希望有大神能解答一下,谢谢啦

    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • 葡萄要吐皮 普通会员 1楼

      final关键字用于声明变量或者方法是常量,不能被修改,这使得变量或者方法的值不会在编译时被改变。

      而volatile关键字用于声明变量的值是可变的,这使得变量的值在编译时会被改变。但是,由于volatile关键字只对读取它的变量起作用,所以对写入volatile的变量的修改不会在编译时被改变。

      所以,final用于声明变量或者方法是常量,不能被修改,而volatile用于声明变量的值是可变的,但是只有读取volatile的变量的修改才会在编译时被改变。这就是final和volatile的主要区别。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部