Java內(nèi)存模型(JMM)-創(chuàng)新互聯(lián)

目錄

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、和田縣ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的和田縣網(wǎng)站制作公司

一、什么是JMM

二、JMM和JVM內(nèi)存區(qū)域模型

三、JMM與硬件內(nèi)存架構(gòu)的關(guān)系

四、Java內(nèi)存模型的操作

五、JMM解決原子性、可見性、有序性問題

原子性問題

可見性問題

有序性問題


一、什么是JMM

Java內(nèi)存模型(Java Memory Model簡(jiǎn)稱JMM)是一種抽象的概念,并不真實(shí)存在,它描述的是一組規(guī)則和規(guī)范,通過這組規(guī)范定義了程序中各個(gè)變量的訪問方式。JVM運(yùn)行程序的實(shí)體是線程,而每個(gè)線程創(chuàng)建時(shí)JVM都會(huì)為其創(chuàng)建一個(gè)工作內(nèi)存,用于存儲(chǔ)線程私有的數(shù)據(jù),而Java內(nèi)存模型中規(guī)定所有變量都存儲(chǔ)在主內(nèi)存,主內(nèi)存時(shí)共享內(nèi)存區(qū)域,所有線程都可以訪問,但線程對(duì)變量的操作(讀取賦值等)必須在工作內(nèi)存中進(jìn)行,首先要將變量從主內(nèi)存拷貝到自己的工作內(nèi)存空間,然后對(duì)變量進(jìn)行操作,操作完成后再將變量寫回主內(nèi)存,不能直接操作主內(nèi)存中的變量,工作內(nèi)存中存儲(chǔ)著主內(nèi)存中的變量副本拷貝。前面說過,工作內(nèi)存時(shí)每個(gè)線程的私有數(shù)據(jù)區(qū)域,因此不同的線程間無法訪問對(duì)方的工作內(nèi)存,線程間的通信必須通過主內(nèi)存來完成。

二、JMM和JVM內(nèi)存區(qū)域模型

JMM與JVM內(nèi)存區(qū)域的劃分是不同的概念層次,更恰當(dāng)說JMM描述的是一組規(guī)則,通過這組規(guī)則控制程序中各個(gè)變量在共享數(shù)據(jù)區(qū)域和私有數(shù)據(jù)區(qū)域的訪問方式,JMM是圍繞原子性、有序性、可見性展開。JMM和Java內(nèi)存區(qū)域唯一相似點(diǎn),在JMM中主內(nèi)存屬于共享數(shù)據(jù)區(qū)域,從某個(gè)程度上講應(yīng)該包括了堆和方法區(qū),而工作內(nèi)存數(shù)據(jù)線程私有數(shù)據(jù)區(qū)域,從某個(gè)程度上講則應(yīng)該包括程序計(jì)數(shù)器、虛擬機(jī)棧以及本地方法棧。

三、JMM與硬件內(nèi)存架構(gòu)的關(guān)系

通過堆Java內(nèi)存模型以及Java多線程、硬件內(nèi)存架構(gòu),我們已經(jīng)意識(shí)到,多線程的執(zhí)行最終都會(huì)映射到硬件處理器上進(jìn)行執(zhí)行,但Java內(nèi)存模型和硬件內(nèi)存架構(gòu)并不完全一致。對(duì)硬件內(nèi)存來說只有寄存器、緩存內(nèi)存、主內(nèi)存的概念,并沒有工作內(nèi)存(線程私有數(shù)據(jù)區(qū)域)和主內(nèi)存(堆內(nèi)存)之分,也就是說Java內(nèi)存模型堆內(nèi)存的劃分對(duì)硬件內(nèi)存并沒有任何影響,因?yàn)镴MM只是一種抽象的概念,是一組規(guī)則,并不實(shí)際存在,不管是工作內(nèi)存的數(shù)據(jù)還是主內(nèi)存的數(shù)據(jù),對(duì)于計(jì)算機(jī)硬件來說都會(huì)存儲(chǔ)在計(jì)算機(jī)主內(nèi)存中,當(dāng)然也有可能存儲(chǔ)到CPU緩存或者寄存器中,因此總體來說,Java內(nèi)存模型和計(jì)算機(jī)硬件內(nèi)存架構(gòu)是一個(gè)相互交叉的關(guān)系,是一種抽象概念劃分與真是物理硬件的交叉。

四、Java內(nèi)存模型的操作

關(guān)于主內(nèi)存與工作內(nèi)存之間的具體交互協(xié)議,即一個(gè)變量如何從主內(nèi)存拷貝到工作內(nèi)存、如何從工作內(nèi)存到主內(nèi)存之間的實(shí)現(xiàn)細(xì)節(jié),Java內(nèi)存模型定義了以下八種操作來完成

①? lock(鎖定):作用于主內(nèi)存的變量,把一個(gè)變量標(biāo)記為一條線程獨(dú)占狀態(tài);

②? unlock(解鎖):作用于主內(nèi)存的變量,把一個(gè)處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定;

③? read(讀取):作用于主內(nèi)存的變量,把一個(gè)變量值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的load動(dòng)作使用;

④? load(載入):作用于工作內(nèi)存的變量,它把read操作從主內(nèi)存中得到的變量值啊放入工作內(nèi)存的變量副本中;

⑤? user(使用):作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個(gè)變量值傳遞給執(zhí)行引擎;

⑥? assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量;

⑦? store(存儲(chǔ)):作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write的操作;

⑧? write(寫入):作用于工作內(nèi)存的變量,它把store操作從工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存的變量中

五、JMM解決原子性、可見性、有序性問題 原子性問題

除了JVM自身提供的對(duì)基本數(shù)據(jù)類型讀寫操作的原子性外,可以通過synchronized和Lock實(shí)現(xiàn)原子性。因?yàn)閟ynchronized和Lock能夠保證任一時(shí)刻只有一個(gè)線程訪問該代碼塊。

可見性問題

volatile關(guān)鍵字保證可見性。當(dāng)一個(gè)共享變量被volatile修飾時(shí),它會(huì)保證修改的值立即被其他的線程看到,即修改的值立刻更新到主內(nèi)存中,當(dāng)其他線程需要讀取時(shí),它會(huì)去內(nèi)存中讀取新值。synchronized和Lock也可以保證可見性,因?yàn)樗鼈兛梢员WC任一時(shí)刻只有一個(gè)線程能訪問共享資源,并在其釋放鎖之前將修改的變量刷新到內(nèi)存中。

有序性問題

在Java里面可以通過volatile關(guān)鍵字來保證一定的有序性。另外可以通過synchronized和Lock保證每個(gè)時(shí)刻是有一個(gè)線程執(zhí)行同步代碼,相當(dāng)于是讓線程順利執(zhí)行同步代碼,自然就保證了有序性。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

文章題目:Java內(nèi)存模型(JMM)-創(chuàng)新互聯(lián)
文章鏈接:http://bm7419.com/article38/didspp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、企業(yè)網(wǎng)站制作、品牌網(wǎng)站建設(shè)外貿(mào)建站、軟件開發(fā)小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)