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