java的內存模型

1、概要介紹

java內存模型,描述了java程序中各類變量(線程共享變量)的訪問規則。以及在jvm中將變量存儲到內存中讀取出變量這樣的底層細節。java

規定一:線程對共享變量的全部操做,都是在本身的工做內存中完成,不能直接從主內存中獲取。jvm

規定二:不一樣線程直接沒法直接訪問他線程工做內存中的變量,必須經過藉助主內存來完成。優化

2、指令重排序

定義:代碼書寫的順序,與執行的順序不一致,重排序是爲了使編譯器或處理器更高的效率執行程序。線程

1.編譯器優化的重排序(編譯器優化)3d

2.指令集並行的重排序(處理器優化)cdn

3.內存系統的重排序(處理器優化)blog

3、共享變量可見性實現的原理。

線程1對共享變量的修改想要被線程2及時看到,必須通過以下步驟:排序

  • 把工做內存1中更新的共享變量刷新到主內存中
  • 把主內存中更新的變量狀況,同步到工做內存2中

4、synchronized實現內存可見性

JMM關於synchronized的兩條規定(保證線程在下次加鎖前獲取到的數據是最新的):內存

  • 線程在解鎖前,必須把共享變量的最新值,更新到主內存中去。
  • 線程加鎖時,將清空工做內存中共享變量的值從而使用從主內存中最新copy的最新副本數據。(特別注意:加鎖和解鎖必須是同一把鎖)

synchronized實現可見性(實現互斥): 步驟一:得到互斥鎖。 步驟二:清空工做內存。 步驟三:從主內存中copy最新的變量副本到工做內存。 步驟四: 執行代碼。 步驟五:將工做內存中的修改的共享變量同步更新到主內存中。 步驟六:釋放互斥鎖。編譯器

5、volatile實現內存可見性

volatile關鍵字:

  • 能夠保證volatile變量的原子性
  • 不能保證volatile變量符合操做的原子性

5、volatile不能保證原子性操做

6、volatile和synchronized的比較

相關文章
相關標籤/搜索