JMM內存模型是JVM的規範

可見性,對於一個該變量的讀,一定能看到讀之前最後的寫入。
防止指令重排序,執行代碼時,爲了提高執行效率,會在不影響最後結果的前提下對指令進行重新排序,使用volatile可以防止,比如單例模式雙重校驗鎖的創建中有使用到,如(https://www.jianshu.com/p/b30a4d568be4)

注意的是volatile不具有原子性,如volatile++這樣的複合操作,這裏感謝大家的指正。

至於volatile底層是怎麼實現保證不同線程可見性的,這裏涉及到的就是硬件上的,被volatile修飾的變量在進行寫操作時,會生成一個特殊的彙編指令,該指令會觸發mesi協議,會存在一個總線嗅探機制的東西,簡單來說就是這個cpu會不停檢測總線中該變量的變化,如果該變量一旦變化了,由於這個嗅探機制,其它cpu會立馬將該變量的cpu緩存數據清空掉,重新的去從主內存拿到這個數據。簡單畫了個圖
在這裏插入圖片描述
Java內存模型(Java Memory Model ,JMM)就是一種符合內存模型規範的,屏蔽了各種硬件和操作系統的訪問差異的,保證了Java程序在各種平臺下對內存的訪問都能保證效果一致的機制及規範

簡要言之,jmm是jvm的一種規範,定義了jvm的內存模型。它屏蔽了各種硬件和操作系統的訪問差異,不像c那樣直接訪問硬件內存,相對安全很多,它的主要目的是解決由於多線程通過共享內存進行通信時,存在的本地內存數據不一致、編譯器會對代碼指令重排序、處理器會對代碼亂序執行等帶來的問題。可以保證併發編程場景中的原子性、可見性和有序性。

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