java内存对象模型
2019獨角獸企業重金招聘Python工程師標準>>>
??????JVM規范定義了java內存模型(Java memory Model )來屏蔽掉各種操作系統、虛擬機實現廠商和硬件的內存訪問差異,以確保java程序在所有操作系統和平臺上能夠實現一次編寫、到處運行的效果。
??????java 內存模型的指定既要嚴謹,保證語義無歧義,還要盡量制定的寬松一些,允許各硬件和虛擬機實現廠商有足夠的靈活性來充分利用硬件的特性提升java的內存訪問性能。睡著JDK的發展,java的內存模型已經逐漸成熟起來。
1.工作內容和主內存
??????java內存模型規定所有的變量都存儲在主內存中(JVM內存的一部分),每個線程有自己獨立的工作內存,它保存了被該線程使用的變量的主內存復制。線程對這些變量的操作都在自己的工作內存中進行,不能直接操作主內存和其他工作內存匯總存儲的變量或者變量副本。線程間的變量訪問需通過主內存來完成,三者的關系如圖所示:
2. Java內存交互協議?
??????Java內存模型定義了8種操作來完成主內存和工作內存的變量訪問,具體如下:
lock:?主內存變量,把一個變量標識為某個線程獨占的狀態。
unlock:?主內存變量,把一個處于鎖定狀態的變量釋放出來,被釋放后的變量才可以被其他線程鎖定。
read:主內存變量,把一個變量的值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用。
load:工作內存變量,把read讀取到的主內存中的變量值放入工作內存的變量副本中。
use:工作內存變量,把工作內存中的變量的值傳遞給JAVA虛擬機執行引擎,每當虛擬機遇到一個需要使用到變量值的字節碼指令時,將會執行該操作。
assign:工作內存變量,把從執行引擎接受到的變量的值賦值給工作變量,每當虛擬機遇到一個給變量賦值的字節碼時,將會執行該操作。
store:工作內存變量,把工作內存中一個變量的值傳送到主內存中,以便隨后的write操作使用
write:主內存變量,把store操作從工作內存中得到的變量值放入主內存的變量中。
3.java的線程
??????并發可以通過多種方式來實現,例如:單進程—單線程模型,通過在一臺服務器上啟動多個進程來實現多任務的并行處理。但是在JAVA語言中,通常是通過單進程—多線程的模型進行多任務的并發處理。因此,我們有必要熟悉一下java的線程。?
大家都知道,線程是比進程更輕量級的調度執行單元,它可以把進程的資源分配和調度執行分開,各個線程可以共享內存、I/O等操作系統資源,但是又能夠被操作系統發起的內核線程或者進程執行。各線程可以獨立的啟動、運行和停止,實現任務的解耦。?
??????主流的操作系統提供了線程實現,目前實現線程的方式主要有三種,分別如下。?
(1)?內核線程(KLT)實現,這種線程有內核來完成線程切換,內核通過線程調度器對線程進行調度,并負責將線程任務映射到不通的處理器上。?
(2)用戶線程實現(UT),通常情況下,用戶線程指的是完全建立在用戶空間線程庫上的線程,用戶線程的創建、啟動、運行、銷毀和切換完全在用戶態中完成,不需要內核的幫助,因此執行性能更高?
(3)混合實現,將內核線程和用戶線程混合在一起使用的方式。
?????? 由于虛擬機規范并沒有強制規定java的線程必須使用哪種方式實現,因此,不同的操作系統實現的方式也可能存在差異。對于SUN的JDK,在Windows和Linux操作系統上采用了內核線程的實現方式,在Solaris版本的JDK中,提供了一些專有的虛擬機線程參數,用于設置使用哪種線程模型。
轉載于:https://my.oschina.net/5u3VuKiX1OPh1/blog/613679
總結
以上是生活随笔為你收集整理的java内存对象模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对过去css+div的总结
- 下一篇: Linux 关闭网络管理服务