另一個試圖提供我從這裏和其他來源的答案中得到的東西的總結(第一次嘗試離基地很遠,我希望這個更好)。
Java內存模型是關於將一個線程中寫入內存的值傳播給其他線程,以便其他線程在從內存中讀取時可以看到它們。
總之,如果你獲得一個互斥鎖,任何釋放該互斥鎖的線程所寫的任何東西都將對你的線程可見。
如果您讀取一個易失性變量,在讀取它之前寫入該易失性變量的任何內容對於讀取線程都是可見的。此外,寫入變量之前寫入變量的線程完成的任何易失性變量寫入都是可見的。而且,在Java 1.5中,任何寫操作都是可變的或不可變的,在寫入volatile變量之前寫入到volatile變量的任何線程上發生的任何寫操作都將對您可見。
構建對象後,可以將其傳遞給另一個線程,並且所有最終成員都將在新線程中可見並完全構建。對非最終成員沒有類似的保證。這使我認爲賦予最終成員充當了寫入volatile變量(內存圍欄)。
線程在Runnable退出之前寫入的任何內容對執行join()的線程都是可見的。線程在執行start()之前寫入的任何內容都可以在生成的線程中看到。
另一件要提到的事情是:volatile變量和同步有一個很少提及的函數:除了刷新線程緩存並提供一次一個線程訪問外,它們還可以防止編譯器和CPU重新排列同步讀寫邊界。
沒有一個是新的,其他答案都表明它更好。我只是想寫這個來清理我的頭。
感謝您的鏈接!它不會取代一本書(我會得到),但它確實給了我一個洞見:我習慣於考慮同步,而內存模型更多地關注重新排序。我需要學會區分這兩者,並想到最後一個。 – Arkadiy 2008-12-12 18:40:04