我對跨線程發佈數據和數據更改有一般疑問。 考慮下面的例子。跨線程的對象可見性
public class DataRace {
static int a = 0;
public static void main() {
new MyThread().start();
a = 1;
}
public static class MyThread extends Thread {
public void run() {
// Access a, b.
}
}
}
讓我們關注main()。
顯然
new MyThread().start();
a = 1;
有我們改變了MyThread的啓動後,共享變量,因此可能不是線程安全的出版物。
a = 1;
new MyThread().start();
不過這次是在變化被安全地跨越新的線程公佈,由於Java語言規範(JLS)保證這是一個線程A可見,當它啓動一個線程B所有變量都可見線程B,它實際上就像在Thread.start()中有一個隱含的同步。
new MyThread().start();
int b = 1;
在當兩個線程已經催生了後一個新的變量分配這種情況下,有沒有保證,新的變量將被安全地發佈到所有線程。即如果var b被另一個線程訪問,它是否保證看到它的值爲1.請注意,我不是在談論之後的任何後續修改(當然這需要同步),但是第一次分配完成由jvm。
感謝,
當兩個線程產生後分配一個新變量時,是否保證新變量將安全地發佈到所有線程。即如果var b被另一個線程訪問,是否保證將其值設爲1? – baskin 2009-05-03 19:36:37
這確實取決於確切的情況。必須有特定的東西來保證閱讀線程不使用緩存值,並且寫入線程已將寫入發佈到共享內存。有關更多(大腦消除)細節,請參閱上面參考的規範的第17章。 – 2009-05-03 20:10:22