繁体   English   中英

为什么System.out.println影响Java中的运行顺序?

[英]Why System.out.println affects the run order in Java?

我对这段代码感到困惑:

public class SynchronizedTest implements Runnable {

private int b = 100;

public synchronized void test01() throws InterruptedException {
    b = 1000;
    Thread.sleep(5000);
}

public synchronized void test02() throws InterruptedException {
    b = 2000;
    Thread.sleep(2500);
  //System.out.println("test02 end !");
}

@Override
public void run() {
    try {
        test01();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws InterruptedException {
    SynchronizedTest test = new SynchronizedTest();
    Thread thread01 = new Thread(test);
    thread01.start();
    test.test02();
    System.out.println(test.b);
}

}

如果我不添加此代码,则System.out.println("test02 end !"); 在上面的代码中。

操作结果将被打印为1000,但是如果在其中输入代码,操作结果将变为“ test02 end!”。 和2000年;

我不知道为什么,怎么解释呢?

这绝对与编译器调度指令的方式有关。 b的值正在更改,但是编译器已在调用test02函数之前安排了打印指令。

SynchronizedTest test = new SynchronizedTest();
Thread thread01 = new Thread(test);
thread01.start();
System.out.println(test.b);
System.out.println(test.b);
test.test02();
System.out.println(test.b);

我尝试了上面的命令,输出是

100
1000
2000

这也支持我的论点。 如果取消注释print语句,则不会发生这种情况,因为编译器现在推断出它必须在test02函数内部打印文本,因此不会更改执行顺序。

但是,我不确定为什么编译器在第一种情况下会更改顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM