完全弄明白之java多线程中的volatile

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

相关文章
相关标签/搜索