完全弄明白之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

相關文章
相關標籤/搜索