1. 程式人生 > 其它 >多執行緒二

多執行緒二

1.volatile 

    不能保證多執行緒修改同一個變數的時候帶來的不一致性問題。也就是不能代替 synchroned.

  • 保證執行緒可見:

  利用硬體MESI ,cup的快取一致性來保障執行緒可見。

  • 禁止指令重排序:

    也是和cup 有關係,現代cup 在編譯(comper)的時候回進行指令重排序, 由cup 元語 loadfence 元語  forefence 元語等。

      • DCL 單例模式  mrg06.java

        1.餓漢模式1 補充程式碼

        2.  double Check LOCk 懶漢模式 要加鎖。雙重判斷null,不然要有執行緒安全問題 程式碼 

單例上必須加 volatile,雖然執行很難出現問題。但是會                                       有指令重排序問題,

         分析一下jvm T t = new T() 的實現過程,1 申請記憶體,2 初始化值 3.賦值  這三個過程會被重排序。如果執行132 的話在執行到 13 的                                  時候另一個執行緒來了。就會出現 t!=null .而直接返回 沒有初始化的 t 因此產生錯誤。 及其高併發的時候才會出現, j加上 volatile 就不會重排                             序。

              

2.synchroned (object o)

  鎖定某個物件 o 時,o 的物件的屬性發生變化的時候依然可以鎖住。但是o的物件發生變化。則鎖定物件也發生變化了。所以避免將鎖定物件的引用變化其         他的物件 (引入final 關鍵字)。

3.CAS(無鎖優化 自旋 樂觀鎖)

      

所有帶有 AtomicXXX的類都是用 CAS 來實現的。

4.ABA 問題

  加 version 解決。

  如果是引用型別會有 你和前男友複合的時候,前男友經歷過多少男人未知

  如果是基本型別 無所謂

5.unSafe 類

 可以直接操作 jvm 的記憶體。