1. 程式人生 > >原子性、可見性、有序性

原子性、可見性、有序性

原子性:由JMM直接保證的原子性變數操作是read、load、assign、use、store和write,大致可以認為基本資料型別的讀寫都是原子性的操作(大多數商用虛擬機器將long和double的讀寫作為原子性操作來對待),對於更大範圍的原子性保證,JMM提供了monitorenter和monitorexit操作,對應Java程式碼中就是synchronized關鍵字。

可見性:可見性是指當一個執行緒修改了共享變數的值,其他執行緒能立即得知這個修改。JMM是通過在變數修改後將新值同步回主記憶體,在變數讀取前從主記憶體重新整理變數值這種依賴主記憶體作為傳遞媒介的方式實現可見性的,無論是普通變數還是volatile變數都是如此,不同的是volatile變數的特殊規則保證了新值能夠立即同步到主記憶體,以及每次使用變數值前立即從主記憶體重新整理變數的資料。

除volatile外,還有synchronized和final可以實現可見性。

final的可見性是指被final修飾的欄位在構造器中一旦完成初始化,並且構造器沒有把“this”的引用傳遞出去(this引用逃逸是一件很危險的事,其他執行緒可能通過這個引用訪問到“初始化一半”的物件),那在其他執行緒中就可以看到final欄位的值。

有序性:如果在本執行緒內觀察,所有的操作都是有序的,這是因為執行緒內表現序列的語義;如果在一個執行緒中觀察另一個執行緒,所有的操作都是無序的,這是因為“指令重排”和“工作記憶體與主記憶體同步延遲”。

 

《深入理解Java虛擬機器》