初步认识Volatile-JMM
什么是JMM?
JMM全稱是Java?Memory?Model.?什么是JMM呢?
通過前面的分析發現,導致可見性問題的根本原因是緩存以及重排序。?而JMM實際上就是提供了合理的禁用緩存以及禁止重排序的方法。所以它最核心的價值在于解決可見性和有序性。
JMM屬于語言級別的抽象內存模型,可以簡單理解為對硬件模型的抽象,它定義了共享內存中多線程程序讀寫操作的行為規范:在虛擬機中把共享變量存儲到內存以及從內存中取出共享變量的底層實現細節
通過這些規則來規范對內存的讀寫操作從而保證指令的正確性,它解決了CPU多級緩存、處理器優化、指令重排序導致的內存訪問問題,保證了并發場景下的可見性。
需要注意的是,JMM并沒有限制執行引擎使用處理器的寄存器或者高速緩存來提升指令執行速度,也沒有限制編譯器對指令進行重排序,也就是說在JMM中,也會存在緩存一致性問題和指令重排序問題。只是JMM把底層的問題抽象到JVM層面,再基于CPU層面提供的內存屏障指令,
以及限制編譯器的重排序來解決并發問題
JMM抽象模型分為主內存、工作內存;主內存是所有線程共享的,一般是實例對象、靜態字段、數組對象等存儲在堆內存中的變量。工作內存是每個線程獨占的,線程對變量的所有操作都必須在工作內存中進行,不能直接讀寫主內存中的變量,線程之間的共享變量值的傳遞都是基于主內存來完成
Java內存模型底層實現可以簡單的認為:通過內存屏障(memory barrier)禁止重排序,即時編譯器根據具體的底層體系架構,將這些內存屏障替換成具體的?CPU?指令。對于編譯器而言,內存屏障將限制它所能做的重排序優化。而對于處理器而言,內存屏障將會導致緩存的刷新操作。
比如,對于volatile,編譯器將在volatile字段的讀寫操作前后各插入一些內存屏障。
?
總結
以上是生活随笔為你收集整理的初步认识Volatile-JMM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初步认识Volatile-CPU层面的内
- 下一篇: JMM 是如何解决 可见性有序性问题的