我有以下問題:爲什麼在這種情況下,第二個線程時看到的第一個線程改變號碼的價值:Java併發
public static void main(String[] args) throws InterruptedException {
Temp t = new Temp();
t.go();
}
static class Temp {
int number = 2;
public void go() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
number = 100;
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println(number);
}
}
}).start();
}
}
我預計從第二個線程,當緩存的數值第一個線程改變它,第二個線程將會「不知道」,並且它將始終打印2!但實際上當第一個線程改變了數字變量時,第二個線程看到了這個改變並開始打印100.爲什麼?我知道第二個線程不會100%確定會緩存這個變量,但在大多數情況下它會這樣做。我缺少一些重要的事情。 在此先感謝。
兩個線程都訪問對象級別的數字變量。沒有你想象的那樣的緩存。我會好奇爲什麼它應該與這裏不同。這種線程間通信模型被稱爲「共享內存」。 –
首先你不能聲明一個類是靜態的! – Hiru
如前所述,該變量是用於創建兩個線程的'Temp'實例的一部分,因此兩個線程都可以訪問該_very相同實例及其數據。 – Thomas