知識鋪: 致力於打造輕知識點,持續更新每次的知識點較少,閱讀不累。不佔太多時間,不停的來喚醒你記憶深處的知識點。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變量仍然有工做內存的拷貝,特殊的操做:禁止指令重排,它須要在本地代碼中插入許多內存屏障指令來保證處理器不發生亂序執行,讀性能消耗與普通變量幾乎相同,可是寫操做稍慢。3d
1、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變量仍然有工做內存的拷貝,特殊的操做:禁止指令重排,它須要在本地代碼中插入許多內存屏障指令來保證處理器不發生亂序執行,讀性能消耗與普通變量幾乎相同,可是寫操做稍慢。
1、JMM,Java內存模型分爲: 主內存,工做內存
1.1 主內存
1.2 工做內存
2、線程安全特性
2.1 原子性
2.2 可見性
2.3 有序性
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學習筆記或整理或轉載,若有侵權請聯繫,必改之。