一. volatite 簡述java
Java 語言提供了一種稍弱的同步機制,即 volatile 變量.用來確保將變量的更新操做通知到其餘線程,保證了新值能當即同步到主內存,以及每次使用前當即從主內存刷新. 當把變量聲明爲volatile類型後,編譯器與運行時都會注意到這個變量是共享的.安全
二. volatite 線程安全?spa
volatile 變量對全部線程是當即可見的,對 volatile 變量全部的寫操做都能當即反應到線程
其餘線程之中,換句話說:volatile 變量在各個線程中是一致的,因此基於 volatile 變量的運算是線程安全的. code
這句話論據貌似沒有錯,論點確實錯的.blog
三. volatite 爲何是線程不安全的?內存
public class VolatileTest{ public static volatile int i; public static void increase(){ i++; } }
javap -c -l VolatileTest.class ci
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 並不徹底是線程安全的.get