我需要一些幫助,以充分了解發生了什麼時,運行此代碼併發修飾的變量:不能完全理解這個例子
public class Main extends Thread {
private static int x;
public static void main(String[] args) {
Thread th1 = new Main("A");
Thread th2 = new Main("B");
th1.start();
th2.start();
}
public Main(String n) {
super(n);
}
public void run() {
while(x<4) { //1
x++; //2
System.out.print(Thread.currentThread().getName()+x+" "); //3
}
}
}
我得到的輸出
B2 B3 B4 A2
我明白線程A
和B
都增加x
,然後B
循環遞增並輸出...但爲什麼最後輸出A2
?當執行//3
時不應該A
看到x
爲4?
紅利問題:爲什麼x
不可能變成5?
編輯
這個問題(在一個稍微不同的形式)來自一個模擬測試OCP認證,其中解釋說x
永遠5.我很高興地看到,我不是唯一一個不同意。
使'x'變得易變。這是一個基本的內存可見性問題。 –
我不想更改代碼,我只需要了解它的工作原理。這只是一個例子 –
然後,也許你應該試着理解爲什麼添加'volatile'會使它工作如何你期望的。 http://stackoverflow.com/questions/4885570/what-does-volatile-mean-in-java –