volatile怎么实现禁止重排序

   private static volatile User user; //第一步

   public User getIns(){ 

       if(Objects.isNull(user)){   //第二步

           synchronized (User.class){ //第三步

               if(Objects.isNull(user)){ //第四步

                   user =  new User(); //第五步

               }
           }
       }
       return  user;
   }

问题是:针对第五步代码 user = new User()

有三步操作

  1. 分配内存 
  2. 初始化对象
  3. 设置instance指向刚分配的地址

这三步在编译器运行时,可能会出现指令重排序, 从1-2-3 排序为1-3-2

多线程场景举例:

例如现在有两个线程A,B。线程A在执行第5步代码时,B线程进到第二步代码,而此时A执行了 1(分配内存 和3设置instance指向刚分配的地址,还没有执行2初始化对象, 但是3方法已经指向了一个对象,也就是说此时对象不为null,只是没初始化。那么此时B线程判断user不为null, 就直接返回一个未初始化的对象,就会出现问题了。

而用了volatile,上面的重排序就会在多线程环境中禁止,只会按照1-2-3执行,就不会出现上述问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值