AtomicInteger用了Volatile麼?結合java內存模型說一下實現原理

volatile[ˈvɒlətaɪl][ˈvɑːlətl] . 先學會讀。單詞原意是不穩定的java

  1. AtomicInteger用了volatile,它是依賴volatile和CAS的原理實現的。volatile保證操做的可見性,經過自旋CAS保證了原子性,由於是非阻塞的,因此效率會比synchronized高
  2. 變量加Volatile被修改了其餘線程能夠馬上知道
    1. 爲何volatile保證可見性卻不保證原子性?
      
      i++;分解 ① int temp=i; ② i=i+1; ③ return i; 併發到③賦值操做的時候,即便是可見的也已經晚了
  3. jmm - java memory mode 
    1. 物理內存模型帶來的問題
      1. cpu緩存和內存
        1. 多處理器更新內容以後先放在緩存中,主內存還未更新時,會出現數據安全問題
        2. 僞共享 false sharing
          1. cpu緩存行64位 可存儲多個變量,數組加載會更快。若是存在多個處理器對不相關但在同一個緩存行的數據進行操做,會出現頻繁失效的狀況,影響併發執行效率
          2. 經過補位的方式進行解決或者註解 
            1. concurrentHashMap  jdk1.8提供@sun.misc.Contended  而且須要在啓動時設置參數
      2. 須要遵循緩存一致性協議 MSI 。。
    2. jmm致使的併發問題  你知道併發Bug的源頭是什麼嗎?
      1. 可見性
        1. 讀到的不是最新的 - 工做線程修改了內容更新到主內存會有一段時間,另外一個工做線程並不能及時讀取到
        2. 解決 volatile & 鎖   
      2. 一致性問題  
        1. 同時修改的時候會丟失操做
        2. 鎖 (並行-串行)
      3. 重排序 - 爲了優化程序性能會對代碼作一些重排序
        1.  編譯器 - 指令級 - 內存
        2. 遵循原則
          1. 操做不具有數據依賴關係
          2. 單線程程序執行結果不能改變   as-if-serial語義  
        3. 重排序在多線程下會有問題  https://www.jianshu.com/p/9b3845714d8a
          1. 內存屏障 防止重排序  load & store   https://www.jianshu.com/p/08a0a8c984ab
            1. store屏障 保證寫操做寫回主存
            2. load屏障 保證讀到主存的值  
      4. 臨界區重排序問題致使單例模式 雙重檢查異常
    3. happens - before
      1. 正確同步下的多線程結果不會改變
  4. Volatile
    1. 修改完變量值以後會把本地內存的值刷新到主存
    2. 對volatile寫操做時,會在前面加入一個storestore屏障,且在後面加入一個storeload屏障。別人寫完我才能寫,我寫完別人才能讀寫
    3. 對volatile讀操做時,會在後面加入一個loadload和loadstore屏障。我讀的時候別人不能讀寫
    4. 底層原理 在執行寫操做時,使用cpu的底層的lock指令  
      1. 會將當前緩存行的數據寫到主內存裏面
      2. 讓其餘緩存行的數據失效

 

 

 

另外看個小甜點 todo 未進行javap 分析數組

代碼
        int a = 0; System.out.println(a++); System.out.println(a); 下面是編譯結果 int a = 0; byte var10001 = a; int a = a + 1; System.out.println(var10001); System.out.println(a); 

 

代碼
        int a = 0; a = a++; System.out.println(a); 下面是編譯代碼 int a = 0; byte var10000 = a; int var2 = a + 1; a = var10000; System.out.println(a);

 

一、i++有三項操做,將值賦給中間變量int temp=i;i=i+1;return i;緩存

二、i=i++有四項操做,將值賦給中間變量int temp=i;i=i+1;i=temp;return i;安全

相關文章
相關標籤/搜索