當在一個表達式中使用一個non-long或者non-double型字段時,原子性可以確保你將獲得這個字段的初始值或者某個線程對這個字段寫入之后的值;但不會是兩個或更多線程在同一時間對這個字段寫入之后產生混亂的結果值(即原子性可以確保,獲取到的結果值所對應的所有bit位,全部都是由單個線程寫入的)。但是,如下面(譯注:指可見性章節)將要看到的,原子性不能確保你獲得的是任意線程寫入之后的最新值。
在java 中除了 long 和 double 之外的所有基本類型的讀和賦值,都是原子性操作。而64位的long 和 double 變量由于會被JVM當作兩個分離的32位來進行操作,所以不具有原子性,會產生字撕裂問題。但是當你定義long或double變量時,如果使用 volatile關鍵字,就會獲到(簡單的賦值與返回操作的)原子性
雖然java內存模型不保證non-volatile long 和 non-volatile double的原子性,當然它們在某些場合也具有原子性。(譯注:non-volatile long在64位JVM,OS,CPU下具有原子性)
新聞熱點
疑難解答