java 内存模型 ——学习笔记
一、Java 內存模型
java內存模型把 Java 虛擬機內部劃分為線程棧和堆
?
下面這張圖演示了調用棧和本地變量存放在線程棧上,對象存放在堆上。
? ? ?==》》?
?
一個局部變量可能是原始類型,在這種情況下,它總是“呆在”線程棧上。
一個局部變量也可能是指向一個對象的一個引用。在這種情況下,引用(這個本地變量)存放在線程棧上,但是對象本身存放在堆上。
一個對象可能包含方法,這些方法可能包含局部變量。這些本地變量任然存放在線程棧上,即使這些方法所屬的對象存放在堆上。
一個對象的成員變量可能隨著這個對象自身存放在堆上。不管這個成員變量是原始類型還是引用類型。
靜態成員變量跟隨著類定義一起也存放在堆上。
存放在堆上的對象可以被所有持有對這個對象引用的線程訪問。當一個線程可以訪問一個對象時,它也可以訪問這個對象的成員變量。如果兩個線程同時調用同一個對象上的同一個方法,它們將會都訪問這個對象的成員變量(共享),但是每一個線程都擁有這個方法內局部變量的私有拷貝。
?
二、計算機硬件內存模型
?
?
三、java內存模型與硬件內存架構之間橋接
?
Java 內存模型與硬件內存架構之間存在差異。硬件內存架構沒有區分線程棧和堆。對于硬件,所有的線程棧和堆都分布在主內中。部分線程棧和堆可能有時候會出現在 CPU 緩存中和 CPU 內部的寄存器中。
?
?
當對象和變量被存放在計算機中各種不同的內存區域中時,就可能會出現一些具體的問題。主要包括如下兩個方面:
- 線程對共享變量修改的可見性 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=》共享變量加上volatile 關鍵字
- 當讀,寫和檢查共享變量時出現 race conditions ? ? ? =》同步解決,同步塊還可以保證代碼塊中所有被訪問的變量將會從主存中讀入,當線程退出同步代碼塊時,所有被更新的變量都會被刷新回主存中去,不管這個變量是否被聲明為 volatile。
?
轉載于:https://www.cnblogs.com/lwcoding/p/6656589.html
總結
以上是生活随笔為你收集整理的java 内存模型 ——学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用jquery的qrcode.js插件
- 下一篇: MII接口概念简述