[英]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.