请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于volatile防止重排序

关于volatile关键字防止重排序,在之前重排序的例子中,也就是OutOfOrderExecution这个类,如果我只对x,y两个变量加上volatile修饰的话,应该也可以达到代码不会出现x = 0;y = 0;的情况。因为 a = 1;一定发生在x = b之前;b = 1;一定发生在y = a;之前。不知道我的理解哪里出了问题,希望老师指正…图片描述图片描述

正在回答

2回答

麻烦同学贴一下完整代码

0 回复 有任何疑惑可以回复我~
提问者 qq_邪饿的小强_0 2019-12-05 00:07:14

public class OutOfOrderExecution {
   private static volatile int x = 0;
   private static volatile int y = 0;
   private static int a = 0, b = 0;

   public static void main(String[] args) throws InterruptedException {

       int i = 0;
       while (true) {
           i++;
           x = y = a = b = 0;

           final CountDownLatch countDownLatch = new CountDownLatch(1);
           Thread one = new Thread(() -> {
               try {
                   countDownLatch.await();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               a = 1;
               x = b;
           });

           Thread two = new Thread(() -> {
               try {
                   countDownLatch.await();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               b = 1;
               y = a;
           });
           one.start();
           two.start();
           countDownLatch.countDown();
           one.join();
           two.join();

           String result = "第" + i + "次(" + "x = " + x + " y = " + y + ")";
           //只有重排序的时候回出现x y 都等于0
           if(x == 0 && y == 0){
               System.out.println(result);
               break;
           }


           //1. 1,0 2.0,1 3.1,1
           System.out.println(result);

       }
   }
}

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    这里的a和b没有volatile,所以可见性无法保证,所以就算没有重排序,那么线程1把a修改为1后,线程2可能看不到这次修改,所以把y赋值为0,这就是出现x y都是0的原因。
    回复 有任何疑惑可以回复我~ 2019-12-05 00:51:38
  • 提问者 qq_邪饿的小强_0 回复 悟空 #2
    我悟了!!感谢
    回复 有任何疑惑可以回复我~ 2019-12-05 09:12:11
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信