欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

目錄

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

一、什么是JMM

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

三、JMM與硬件內(nèi)存架構的關系

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

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

原子性問題

可見性問題

有序性問題


一、什么是JMM

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

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

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

三、JMM與硬件內(nèi)存架構的關系

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

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

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

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

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

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

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

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

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

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

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

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

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

可見性問題

volatile關鍵字保證可見性。當一個共享變量被volatile修飾時,它會保證修改的值立即被其他的線程看到,即修改的值立刻更新到主內(nèi)存中,當其他線程需要讀取時,它會去內(nèi)存中讀取新值。synchronized和Lock也可以保證可見性,因為它們可以保證任一時刻只有一個線程能訪問共享資源,并在其釋放鎖之前將修改的變量刷新到內(nèi)存中。

有序性問題

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

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

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

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

廣告

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

商城網(wǎng)站建設