java乱序执行实验

南飓风  金牌会员 | 2024-12-18 17:55:41 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 765|帖子 765|积分 2295

        为了对Java代码进行优化,提高执行服从,JVM和编译器对代码进行了优化,有些代码可能会乱序执行。
实验代码如下:
  1. for (int i = 0; i < Integer.MAX_VALUE; i++) {
  2.     a = 0;
  3.     b = 0;
  4.     x = 0;
  5.     y = 0;
  6.     Thread t1 = new Thread(() -> {
  7.         a = 1;
  8.         x = b;
  9.     }, "t1");
  10.     Thread t2 = new Thread(() -> {
  11.         b = 1;
  12.         y = a;
  13.     }, "t2");
  14.     t1.start();
  15.     t2.start();
  16.     t1.join();
  17.     t2.join();
  18.     if (x == 0 && y == 0) {
  19.         System.out.println("x == 0 && y == 0");
  20.     }
  21. }
复制代码
如果是次序执行的话,
        情况1:
                当执行到x=b时,还未执行b=1,那么b=0,x=0,此时a=1已经执行过了,最后y=1
        情况2:
                当执行到x=b时,已经执行b=1,那么b=1,x=1,此时a=1已经执行过了,最后y=1
                以是x=0或x=1时,y=1
                同理y=0或y=1时,x=1
        那么不可能出现x与y同时为0的情况
        但是实验结果证明代码是乱序执行的,测试15s,控制台打印结果如下:
  1. x == 0 && y == 0
  2. x == 0 && y == 0
  3. x == 0 && y == 0
  4. x == 0 && y == 0
复制代码
         可以看出15s内出现了4次乱序执行,之以是出现这种情况,就是代码从
  1. Thread t1 = new Thread(() -> {
  2.         a = 1;
  3.         x = b;
  4. }, "t1");
  5. Thread t2 = new Thread(() -> {
  6.         b = 1;
  7.         y = a;
  8. }, "t2");
复制代码
        变为了
  1. Thread t1 = new Thread(() -> {
  2.         x = b;
  3.         a = 1;
  4. }, "t1");
  5. Thread t2 = new Thread(() -> {
  6.         y = a;
  7.         b = 1;
  8. }, "t2");
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表