一. 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