国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JMM(Java內(nèi)存模型)詳解

這篇具有很好參考價(jià)值的文章主要介紹了JMM(Java內(nèi)存模型)詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.什么是JMM?

? JMM 是Java內(nèi)存模型( Java Memory Model),簡稱JMM。它本身只是一個(gè)抽象的概念,并不真實(shí)存在,它描述的是一種規(guī)則或規(guī)范,是和多線程相關(guān)的一組規(guī)范。通過這組規(guī)范,定義了程序中對(duì)各個(gè)變量(包括實(shí)例字段,靜態(tài)字段和構(gòu)成數(shù)組對(duì)象的元素)的訪問方式。需要每個(gè)JVM 的實(shí)現(xiàn)都要遵守這樣的規(guī)范,有了JMM規(guī)范的保障,并發(fā)程序運(yùn)行在不同的虛擬機(jī)上時(shí),得到的程序結(jié)果才是安全可靠可信賴的。如果沒有JMM 內(nèi)存模型來規(guī)范,就可能會(huì)出現(xiàn),經(jīng)過不同 JVM 翻譯之后,運(yùn)行的結(jié)果不相同也不正確的情況。

? 計(jì)算機(jī)在執(zhí)行程序時(shí),每條指令都是在CPU中執(zhí)行的。而執(zhí)行指令的過程中,勢(shì)必涉及到數(shù)據(jù)的讀取和寫入。由于程序運(yùn)行過程中的臨時(shí)數(shù)據(jù)是存放在主存(物理內(nèi)存)當(dāng)中的,這時(shí)就存在一個(gè)問題,由于CPU執(zhí)行速度很快,而從內(nèi)存讀取數(shù)據(jù)和向內(nèi)存寫入數(shù)據(jù)的過程,跟CPU執(zhí)行指令的速度比起來要慢的多(硬盤 < 內(nèi)存 <緩存cache < CPU)。因此如果任何時(shí)候?qū)?shù)據(jù)的操作都要通過和內(nèi)存的交互來進(jìn)行,會(huì)大大降低指令執(zhí)行的速度。因此在CPU里面就有了高速緩存。也就是當(dāng)程序在運(yùn)行過程中,會(huì)將運(yùn)算需要的數(shù)據(jù)從主存復(fù)制一份到CPU的高速緩存當(dāng)中,那么CPU進(jìn)行計(jì)算時(shí),就可以直接從它的高速緩存中讀取數(shù)據(jù)或向其寫入數(shù)據(jù)了。當(dāng)運(yùn)算結(jié)束之后,再將高速緩存中的數(shù)據(jù)刷新到主存當(dāng)中。

JMM 抽象出主存儲(chǔ)器(Main Memory)和工作存儲(chǔ)器(Working Memory)兩種。
·主存儲(chǔ)器是實(shí)例對(duì)象所在的區(qū)域,所有的實(shí)例都存在于主存儲(chǔ)器內(nèi)。比如,實(shí)例所擁有的字段即位于主存儲(chǔ)器內(nèi),主存儲(chǔ)器是所有的線程所共享的。
·工作存儲(chǔ)器是線程所擁有的作業(yè)區(qū),每個(gè)線程都有其專用的工作存儲(chǔ)器。工作存儲(chǔ)器存有主存儲(chǔ)器中必要部分的拷貝,稱之為工作拷貝(Working Copy)。
所以,線程無法直接對(duì)主內(nèi)存進(jìn)行操作,此外,線程A想要和線程B通信,只能通過主存進(jìn)行。

2.JMM的三大特性:

JMM的三大特性:原子性、可見性、有序性。

1.原子性

一個(gè)或多個(gè)操作,要么全部執(zhí)行,要么全部不執(zhí)行(執(zhí)行的過程中是不會(huì)被任何因素打斷的)。

2.可見性

只要有一個(gè)線程對(duì)共享變量的值做了修改,其他線程都將馬上收到通知,立即獲得最新值。

3.有序性

? 有序性可以總結(jié)為:在本線程內(nèi)觀察,所有的操作都是有序的;而在一個(gè)線程內(nèi)觀察另一個(gè)線程,所有操作都是無序的。前半句指 as-if-serial 語義:線程內(nèi)似表現(xiàn)為串行,后半句是指:“指令重排序現(xiàn)象”和“工作內(nèi)存與主內(nèi)存同步延遲現(xiàn)象”。處理器為了提高程序的運(yùn)行效率,提高并行效率,可能會(huì)對(duì)代碼進(jìn)行優(yōu)化。編譯器認(rèn)為,重排序后的代碼執(zhí)行效率更優(yōu)。這樣一來,代碼的執(zhí)行順序就未必是編寫代碼時(shí)候的順序了,在多線程的情況下就可能會(huì)出錯(cuò)。

? 在代碼順序結(jié)構(gòu)中,我們可以直觀的指定代碼的執(zhí)行順序, 即從上到下按序執(zhí)行。但編譯器和CPU處理器會(huì)根據(jù)自己的決策,對(duì)代碼的執(zhí)行順序進(jìn)行重新排序,優(yōu)化指令的執(zhí)行順序,提升程序的性能和執(zhí)行速度,使語句執(zhí)行順序發(fā)生改變,出現(xiàn)重排序,但最終結(jié)果看起來沒什么變化(在單線程情況下)。

? 有序性問題 指的是在多線程的環(huán)境下,由于執(zhí)行語句重排序后,重排序的這一部分沒有一起執(zhí)行完,就切換到了其它線程,導(dǎo)致計(jì)算結(jié)果與預(yù)期不符的問題。這就是編譯器的編譯優(yōu)化給并發(fā)編程帶來的程序有序性問題。

Java 語言提供了 volatile 和 synchronized 兩個(gè)關(guān)鍵字來保證線程之間操作的有序性,volatile 是因?yàn)槠浔旧戆敖怪噶钪嘏判颉钡恼Z義,synchronized 是由“一個(gè)變量在同一個(gè)時(shí)刻只允許一條線程對(duì)其進(jìn)行 lock 操作”這條規(guī)則獲得的,此規(guī)則決定了持有同一個(gè)對(duì)象鎖的兩個(gè)同步塊只能串行進(jìn)入。

3.關(guān)于同步的規(guī)定:

1.線程解鎖前,必須把共享變量的值刷新回主內(nèi)存。

2.線程加鎖前,必須將主內(nèi)存的最新值讀取到自己的工作內(nèi)存。

3.加鎖解鎖是同一把鎖。

4.解釋說明

? 在JVM中,棧負(fù)責(zé)運(yùn)行(主要是方法),堆負(fù)責(zé)存儲(chǔ)(比如new的對(duì)象)。由于JVM運(yùn)行程序的實(shí)體是線程,而每個(gè)線程在創(chuàng)建時(shí),JVM都會(huì)為其創(chuàng)建一個(gè)工作內(nèi)存(有些地方稱為??臻g),工作內(nèi)存是每個(gè)線程的私有數(shù)據(jù)區(qū)域。而JAVA內(nèi)存模型中規(guī)定,所有變量都存儲(chǔ)在主內(nèi)存中,主內(nèi)存是共享內(nèi)存區(qū)域,所有線程都可以訪問。

? 但線程對(duì)變量的操作(讀取賦值等)必須在自己的工作內(nèi)存中進(jìn)行。首先要將變量從主內(nèi)存拷貝到自己的工作內(nèi)存空間,然后對(duì)變量進(jìn)行操作,操作完成后,再將變量寫回到主內(nèi)存。由于不能直接操作主內(nèi)存中的變量,各個(gè)線程的工作內(nèi)存中存儲(chǔ)著主內(nèi)存中的變量副本,因此,不同的線程之間無法直接訪問對(duì)方的工作內(nèi)存,線程間的通信(傳值)必須通過主內(nèi)存來完成。

JMM中的八種操作:

為了支持 JMM,Java 定義了8種原子操作,用來控制主存與工作內(nèi)存之間的交互:

·read 讀取:作用于主內(nèi)存,將共享變量從主內(nèi)存?zhèn)魉偷骄€程的工作內(nèi)存中。
·load 載入:作用于工作內(nèi)存,把 read 讀取的值放到工作內(nèi)存中的副本變量中。
·store 存儲(chǔ):作用于工作內(nèi)存,把工作內(nèi)存中的變量傳送到主內(nèi)存中。
·write 寫入:作用于主內(nèi)存,把從工作內(nèi)存中 store 傳送過來的值寫到主內(nèi)存的變量中。
·use 使用:作用于工作內(nèi)存,把工作內(nèi)存的值傳遞給執(zhí)行引擎,當(dāng)虛擬機(jī)遇到一個(gè)需要使用這個(gè)變量的指令時(shí),就會(huì)執(zhí)行這個(gè)動(dòng)作。
·assign 賦值:作用于工作內(nèi)存,把執(zhí)行引擎獲取到的值賦值給工作內(nèi)存中的變量,當(dāng)虛擬機(jī)棧遇到給變量賦值的指令時(shí),就執(zhí)行此操作。
·lock鎖定: 作用于主內(nèi)存,把變量標(biāo)記為線程獨(dú)占狀態(tài)。
·unlock解鎖: 作用于主內(nèi)存,它將釋放獨(dú)占狀態(tài)。文章來源地址http://www.zghlxwxcb.cn/news/detail-402845.html

到了這里,關(guān)于JMM(Java內(nèi)存模型)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 了解JAVA內(nèi)存模型(JMM)

    我們常說的JMM指的是Java內(nèi)存模型(Java Memory Model,JMM),主要用于控制Java程序解決線程間如何通信和數(shù)據(jù)同步,JMM規(guī)范了多線程訪問共享內(nèi)存時(shí)的 可見性、有序性和原子性 。 所有的共享變量都存在 主內(nèi)存 中; 每個(gè)線程 都保存了一份該線程使用到的 共享變量的副本 。 如

    2024年02月06日
    瀏覽(30)
  • [JVM] 淺談JMM(Java 內(nèi)存模型)

    Java 內(nèi)存模型(Java Memory Model,JMM)是 Java 虛擬機(jī)規(guī)范中定義的一種抽象計(jì)算機(jī)內(nèi)存模型,用于描述 Java 程序在多線程下的內(nèi)存訪問行為。JMM 定義了線程之間共享變量的可見性和有序性規(guī)則,為開發(fā)者提供了一種可靠的同步機(jī)制,以避免并發(fā)程序中常見的線程安全問題。 JMM

    2024年01月16日
    瀏覽(33)
  • Java內(nèi)存區(qū)域(運(yùn)行時(shí)數(shù)據(jù)區(qū)域)和內(nèi)存模型(JMM)

    Java內(nèi)存區(qū)域(運(yùn)行時(shí)數(shù)據(jù)區(qū)域)和內(nèi)存模型(JMM)

    Java?內(nèi)存區(qū)域和內(nèi)存模型是不一樣的東西,內(nèi)存區(qū)域是指 Jvm 運(yùn)行時(shí)將數(shù)據(jù)分區(qū)域存儲(chǔ),強(qiáng)調(diào)對(duì)內(nèi)存空間的劃分。 而內(nèi)存模型(Java Memory?Model,簡稱 JMM )是定義了線程和主內(nèi)存之間的抽象關(guān)系,即 JMM 定義了 JVM 在計(jì)算機(jī)內(nèi)存(RAM)中的工作方式,如果我們要想深入了解Java并發(fā)

    2024年02月12日
    瀏覽(32)
  • Java內(nèi)存模型(JMM)和volatile原理

    Java內(nèi)存模型(JMM)和volatile原理

    目錄 一、Java 內(nèi)存模型 二、可見性 三、有序性 四、volatile原理 ?1、可見性保證 2、有序性保證 五、線程安全的單例 JMM即Java Memory Model,他定義了 主存(共享的數(shù)據(jù)) 、 工作內(nèi)存(私有的數(shù)據(jù)) 抽象概念,底層對(duì)應(yīng)著CPU寄存器、緩存、硬件內(nèi)存、CPU指令優(yōu)化等 JMM體現(xiàn)以下

    2024年02月09日
    瀏覽(26)
  • Java 內(nèi)存模型(JMM)探尋原理,深度講解

    Java 內(nèi)存模型(JMM)探尋原理,深度講解

    目錄 一. 前言 二. 為什么會(huì)有內(nèi)存模型 2.1.?硬件內(nèi)存架構(gòu) 2.2.?緩存一致性問題 2.3.?處理器優(yōu)化和指令重排序 三.?并發(fā)編程的問題 四. Java 內(nèi)存模型(JMM) 4.1.?Java 運(yùn)行時(shí)內(nèi)存區(qū)域與硬件內(nèi)存的關(guān)系 4.2.?Java 線程與主內(nèi)存的關(guān)系 4.3.?線程間通信 五. 主內(nèi)存和工作內(nèi)存 六.?J

    2024年04月22日
    瀏覽(29)
  • 【Java多線程學(xué)習(xí)7】JMM(Java內(nèi)存模型)學(xué)習(xí)

    【Java多線程學(xué)習(xí)7】JMM(Java內(nèi)存模型)學(xué)習(xí)

    JMM(Java內(nèi)存模型),可以看作是 Java定義的并發(fā)編程相關(guān)的一組規(guī)范 ,除了抽象了 線程和主內(nèi)存 之間的關(guān)系之外,其還規(guī)定了從 Java源代碼 到 CPU可執(zhí)行指令 的這個(gè)轉(zhuǎn)化過程中要遵守哪些并發(fā)相關(guān)的原則和規(guī)范,其主要目的是 簡化多線程編程 , 增強(qiáng)程序的可移植性 。 至于

    2024年02月11日
    瀏覽(25)
  • 并發(fā)編程之三大特性及JMM內(nèi)存模型

    并發(fā)編程之三大特性及JMM內(nèi)存模型

    目錄 原子性 如何保證原子性 可見性 如何保證可見性 有序性 如何保證有序性 Java內(nèi)存模型(JMM內(nèi)存模型) Java內(nèi)存模型的一些關(guān)鍵概念: 主內(nèi)存與工作內(nèi)存交互協(xié)議 Java內(nèi)存模型通過以下手段來確保多線程程序的正確性: 鎖機(jī)制 volatile volatile禁止指令重排序 ?Happens-Before 并發(fā)三

    2024年01月19日
    瀏覽(27)
  • 【JUC系列-01】深入理解JMM內(nèi)存模型的底層實(shí)現(xiàn)原理

    【JUC系列-01】深入理解JMM內(nèi)存模型的底層實(shí)現(xiàn)原理

    JUC系列整體欄目 內(nèi)容 鏈接地址 【一】深入理解JMM內(nèi)存模型的底層實(shí)現(xiàn)原理 https://zhenghuisheng.blog.csdn.net/article/details/132400429 【二】深入理解CAS底層原理和基本使用 https://blog.csdn.net/zhenghuishengq/article/details/132478786 【三】熟練掌握Atomic原子系列基本使用 https://blog.csdn.net/zhenghuis

    2024年02月12日
    瀏覽(26)
  • Linux——詳解共享內(nèi)存shared memory

    Linux——詳解共享內(nèi)存shared memory

    目錄 一.共享內(nèi)存介紹 (一).什么是共享內(nèi)存 (二).共享內(nèi)存優(yōu)點(diǎn) (三).共享內(nèi)存缺點(diǎn) 二.共享內(nèi)存使用 (一).創(chuàng)建—shmget ①key ②size ③shmflg ④返回值 (二).連接—shmat (三).分離—shmdt (四).銷毀—shmctl (五).查看—ipcs (六).刪除—ipcrm (七).讀取與寫入? 三

    2023年04月16日
    瀏覽(28)
  • Java——內(nèi)存模型詳解!

    Java——內(nèi)存模型詳解!

    Java內(nèi)存模型是一種抽象的規(guī)則或規(guī)范,定義了程序中存在競爭現(xiàn)象的對(duì)象(包括實(shí)例字段、靜態(tài)字段和數(shù)組對(duì)象,不包括局部變量,形式參數(shù);后者是線程私有,不存在競爭問題)的訪問方式。 ????????如果我們要想深入了解Java并發(fā)編程,就要先理解好Java內(nèi)存模型。J

    2024年02月06日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包