一. volatite 簡述
Java 語言提供了一種稍弱的同步機制,即 volatile 變量.用來確保將變量的更新操作通知到其他線程,保證了新值能立即同步到主內存,以及每次使用前立即從主內存刷新. 當把變量聲明為volatile類型后,編譯器與運行時都會注意到這個變量是共享的.
二. volatite 線程安全?
volatile 變量對所有線程是立即可見的,對 volatile 變量所有的寫操作都能立即反應到
其他線程之中,換句話說:volatile 變量在各個線程中是一致的,所以基於 volatile 變量的運算是線程安全的.
這句話論據貌似沒有錯,論點確實錯的.
三. volatite 為什么是線程不安全的?
public class VolatileTest{ public static volatile int i; public static void increase(){ i++; } }
javap -c -l VolatileTest.class
public class VolatileTest { public static volatile int i; public VolatileTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static void increase(); Code: 0: getstatic #2 // Field i:I, 把i的值取到了操作棧頂,volatile保證了i值此時是正確的. 3: iconst_1 4: iadd // increase,但其他線程此時可能已經把i值加大了好多 5: putstatic #2 // Field i:I ,把這個已經out of date的i值同步回主內存中,i值被破壞了. 8: return LineNumberTable: line 6: 0 line 7: 8 }
從這個角度說 volatile 並不完全是線程安全的.