讀一本書,這個代碼出現:的Java指令重新排序/緩存線程
public class Test {
private static boolean ready = false;
private static int number = 0;
public static class ListenerThread extends Thread {
public void run() {
while(!ready) {
Thread.yield();
}
System.out.println(number);
}
}
public static void main (String[] args) {
new ListenerThread().start();
number = 10;
ready = true;
}
}
主要觀點我很驚訝被筆者比較快提及。
他們說ListenerThread可能永遠不會終止。我想了幾天(在我的腦海裏),我唯一的結論是它可能被ListenerThread緩存。真的嗎?使
ready
不穩定地解決問題(因爲它不應該緩存它)?他們也表示程序可能會打印0.現在我明白了Java可能會重新排列指令,因此在數字更改之前,準備好會變爲另一個線程。有沒有什麼方法(技術),除了把這些指令放在同步塊中解決問題(在中心鎖定值上)?我想也許實現notify()/ wait(),但我覺得它會遭受同樣的後果。避免這個問題的最好方法是什麼?
謝謝!
編輯:
我只是覺得,我已經經歷了很多代碼看,很少煩惱,以防止在多線程重新排序。這有多常見?
OP沒有提到在'Test'上同步,而是使用'synchronized'塊(可能在某個將會工作的相互鎖定)。 – yair
@yair,是的,我想將隨時可用的鎖定變量中的準備檢查和打印以及變量賦值放入同步塊中,但這看起來過於緩慢。 – jn1kk
是的,它只是不清楚OP「同步塊」的含義。編輯。 – fge