二 JAVA內存模型(JMM)

  • JMM介紹:

      java內存模型是一種抽象的概念,並不真實存在。規定變量都存儲在主內存中,主內存是共享區域,所有的線程都可以訪問。但對變量的操作必須在工作內存完成(工作內存是JVM爲每個線程創建的私有數據區域),首先將變量從主內存拷貝到自己的工作內存,然後對變量進行操作,操作完成寫回主內存。

  • 三個特性:

      1.可見性:多個線程操作共享數據彼此可見 ;
      2.原子性:操作是連續不可分割;
      3.有序性:計算機執行程序爲了提高性能,編譯器和處理器常常會對指令重排,分三種:1、編譯器優化的重排;2、指令並行的重排;3、內存系統的重排,它們需要數據的依賴性來保證最終結果一致,可以禁止指令重排;

Volatile

  是一種輕量級的鎖,可以保證內存可見性和有序性(禁止指令重排),不保證原子性。使用場景如:本地程序緩存同步,判斷是否正在同步的標誌可以使用volatile修飾。

AtomicInteger或AtomicReference

  可以實現原子性,底層採用的CAS算法。算法思路有三個值:1、內存值;2、預估值;3、更新值;只有內存值等於預估值時,纔會把更新值賦值給內存值,否則自旋。image.png

CAS全稱Compare And Swap,是一條CPU併發原語句,執行過程中不允許被中斷。

CAS核心類時UnSafe類,該類所有的方法都是native修飾,可以直接操作特定的內存數據。

CAS缺點:循環時間長開銷會很大;只能保證一個共享變量的原子操作;存在ABA問題。ABA問題比如:線程一從內存位置V取出值A,線程二也從內存位置V取出值A,並修改爲B,再改爲A。此時線程一發現內存中仍然是A,然後操作成功,但這個過程是有問題的。

解決ABA問題,引入版本號機制,可以使用AtomicStampReference.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章