知識鋪: 致力于打造輕知識點,持續更新每次的知識點較少,閱讀不累,不占太多時間,不停的來喚醒你記憶深處的知識點,
1.Java記憶體模型是每個java程式員必須掌握理解的
2.Java記憶體模型的主要目標是定義程式中各個變數的訪問規則,即在JVM中將變數存盤到記憶體和從記憶體中取出變數這樣的底層細節
3.Java的并發采用的是共享記憶體模型
4.Java記憶體模型:JMM(Java Memory Model)
5.JMM規定了所有的變數都存盤在主記憶體(Main Memory)
6.每個執行緒還有自己的作業記憶體(Working Memory), 執行緒的作業記憶體中保存了該執行緒使用到的變數的主記憶體的副本拷貝
7.執行緒對變數的所有操作(讀取、賦值等)都必須在作業記憶體中進行
8.不能直接讀寫主記憶體中的變數
9.特例:volatile變數仍然有作業記憶體的拷貝,特殊的操作:禁止指令重排,它需要在本地代碼中插入許多記憶體屏障指令來保證處理器不發生亂序執行,讀性能消耗與普通變數幾乎相同,但是寫操作稍慢,
一、JMM,Java記憶體模型分為: 主記憶體,作業記憶體
知識鋪: 致力于打造輕知識點,持續更新每次的知識點較少,閱讀不累,不占太多時間,不停的來喚醒你記憶深處的知識點,
1.Java記憶體模型是每個java程式員必須掌握理解的
2.Java記憶體模型的主要目標是定義程式中各個變數的訪問規則,即在JVM中將變數存盤到記憶體和從記憶體中取出變數這樣的底層細節
3.Java的并發采用的是共享記憶體模型
4.Java記憶體模型:JMM(Java Memory Model)
5.JMM規定了所有的變數都存盤在主記憶體(Main Memory)
6.每個執行緒還有自己的作業記憶體(Working Memory), 執行緒的作業記憶體中保存了該執行緒使用到的變數的主記憶體的副本拷貝
7.執行緒對變數的所有操作(讀取、賦值等)都必須在作業記憶體中進行
8.不能直接讀寫主記憶體中的變數
9.特例:volatile變數仍然有作業記憶體的拷貝,特殊的操作:禁止指令重排,它需要在本地代碼中插入許多記憶體屏障指令來保證處理器不發生亂序執行,讀性能消耗與普通變數幾乎相同,但是寫操作稍慢,
一、JMM,Java記憶體模型分為: 主記憶體,作業記憶體

1.1 主記憶體

1.2 作業記憶體

二、執行緒安全特性
2.1 原子性

2.2 可見性

2.3 有序性

三、指令重排理解
3.1 指令重排分幾種

3.2 核心點
兩個執行緒之間在執行同一段代碼之間的critical area,在不同的執行緒之間共享變數;由于執行順序、CPU編譯器對于程式指令的優化等造成了不確定的執行結果,
3.3 原因
主要還是編譯器以及CPU為了優化代碼或者執行的效率而執行的優化操作;
3.3 防止指令重排
volatile關鍵字可以保證變數的可見性,因為對volatile的操作都在Main Memory中,而Main Memory是被所有執行緒所共享的,這里的代價就是犧牲了性能,無法利用暫存器或Cache,因為它們都不是全域的,無法保證可見性,可能產生臟讀,
volatile還有一個作用就是區域阻止重排序的發生,對volatile變數的操作指令都不會被重排序,因為如果重排序,又可能產生可見性問題,
在保證可見性方面,鎖(包括顯式鎖、物件鎖)以及對原子變數的讀寫都可以確保變數的可見性,但是實作方式略有不同,例如同步鎖保證得到鎖時從記憶體里重新讀入資料重繪快取,釋放鎖時將資料寫回記憶體以保資料可見,而volatile變數干脆都是讀寫記憶體,
本文由zshipu.com學習筆記或整理或轉載,如有侵權請聯系,必改之,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/53271.html
標籤:其他
上一篇:對學習態度的反思
