簡體   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