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