徹底弄明白之java多線程中的volatile


一. 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 並不完全是線程安全的.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM