日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java内存图解_图解JAVA内存模型(JMM:JAVA Memory Model)

發(fā)布時(shí)間:2024/4/20 编程问答 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java内存图解_图解JAVA内存模型(JMM:JAVA Memory Model) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文主要說(shuō)明兩個(gè)問(wèn)題:JMM存在的意義是什么?JMM內(nèi)部的工作原理是什么(重點(diǎn)講一下并發(fā)編程模式下的數(shù)據(jù)訪(fǎng)問(wèn)一致性問(wèn)題) 。

1.為什么要使用JMM?

當(dāng)我們剛開(kāi)始接觸JAVA語(yǔ)言的時(shí)候,就會(huì)被告知JAVA程序是可以實(shí)現(xiàn)跨平臺(tái)運(yùn)行的(即同一份代碼資源可運(yùn)行在不同的硬件配置下,不同的操作系統(tǒng)下)。那么JAVA 是如何在不同的硬件和操作系統(tǒng)內(nèi)存訪(fǎng)問(wèn)方式存在差異的情況下,實(shí)現(xiàn) 同一個(gè)Java 程序在各種平臺(tái)下的運(yùn)行結(jié)果都相同(達(dá)到一致的內(nèi)存訪(fǎng)問(wèn)效果)的呢。靠的就是神奇的JMM。

在這里要牢記兩個(gè)事實(shí):

(1)我們平時(shí)所寫(xiě)的每一行程序代碼其實(shí)就是對(duì)計(jì)算機(jī)發(fā)出的一個(gè)操作指令,而這些指令的運(yùn)行空間是CPU。

(2)程序中不可避免的會(huì)涉及到對(duì)變量和臨時(shí)數(shù)據(jù)的讀取與寫(xiě)入。而這些變量和臨時(shí)數(shù)據(jù)是存儲(chǔ)在物理內(nèi)存memory中的。

而CPU和內(nèi)存兩者之間存在一個(gè)很明顯的速度不匹配問(wèn)題:

CPU 執(zhí)行速度很快,而從內(nèi)存讀取數(shù)據(jù)和向內(nèi)存寫(xiě)入數(shù)據(jù)的過(guò)程跟 CPU 執(zhí)行指令的速度比起來(lái)要差幾個(gè)數(shù)量級(jí),因此如果任何時(shí)候?qū)?shù)據(jù)的操作都要通過(guò)和內(nèi)存的交互來(lái)進(jìn)行,會(huì)大大降低指令執(zhí)行的速度。

為解決該矛盾,人們便在CPU和內(nèi)存之間增加了高速緩存cache,如下圖所示:

增加了cache后,程序的執(zhí)行過(guò)程就變?yōu)?#xff1a;

(1)將運(yùn)算需要的數(shù)據(jù)從主存復(fù)制一份到CPU的高速緩存當(dāng)中

(2)CPU進(jìn)行計(jì)算時(shí)就可以直接從它的高速緩存讀取數(shù)據(jù)和向其中寫(xiě)入數(shù)據(jù)

(3)運(yùn)算結(jié)束之后,再將高速緩存中的數(shù)據(jù)刷新到主存當(dāng)中。

事實(shí)上,CPU上可能同時(shí)開(kāi)多個(gè)線(xiàn)程,多個(gè)線(xiàn)程對(duì)同一份數(shù)據(jù)進(jìn)行訪(fǎng)問(wèn),很容易出現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn)不一致的問(wèn)題。如何保證數(shù)據(jù)訪(fǎng)問(wèn)的一致性是我們JMM要解決的關(guān)鍵問(wèn)題。

2.JMM的內(nèi)部工作機(jī)制

java內(nèi)存模型和jvm內(nèi)存模型是不一樣,要區(qū)分開(kāi)。如上圖所示,多個(gè)線(xiàn)程對(duì)共享變量并沒(méi)有直接采用加鎖的方式,其中

(1)實(shí)際內(nèi)存(也叫主內(nèi)存)中存儲(chǔ)的是待共享的變量值。

(2)CPU中每個(gè)線(xiàn)程可以保留共享變量的副本。其中保存共享副本的地方稱(chēng)為每一個(gè)線(xiàn)程的工作內(nèi)存threadLocal。每一個(gè)線(xiàn)程只能直接操作對(duì)應(yīng)工作內(nèi)存中的變量。

而不同線(xiàn)程之間的變量值傳遞則需要通過(guò)主內(nèi)存(memory)來(lái)完成。如何保證主內(nèi)存和線(xiàn)程工作內(nèi)存的數(shù)據(jù)一致性,是我們需要重點(diǎn)關(guān)注的地方:

事實(shí)上,JMM中使用volatile關(guān)鍵字保證主內(nèi)存和線(xiàn)程工作內(nèi)存的數(shù)據(jù)一致性.

其工作原理大致如下:

(1)線(xiàn)程A的工作內(nèi)存中的變量一旦發(fā)生了變化,就會(huì)有監(jiān)視器檢測(cè)到該變化。

(2)檢測(cè)器通知CPU將該變化值刷新到內(nèi)存。

(3)其他線(xiàn)程B/C..,在使用同一個(gè)變量時(shí),為保證訪(fǎng)問(wèn)到的數(shù)據(jù)確實(shí)是線(xiàn)程A修改過(guò)的新數(shù)據(jù),其采用的是CAS樂(lè)觀鎖策略(簡(jiǎn)單理解就是,永遠(yuǎn)以主存中的內(nèi)容為參考)。即,

1)拿自己工作內(nèi)存中的變量值和主存中的變量值比較

2)如果相等,則使用工作內(nèi)存threadLocal里的變量

3)如果不相等,則用主內(nèi)存的變量替換本地的變量

而JMM的性能問(wèn)題,則是通過(guò)指令重排的方式保證。

總結(jié)

以上是生活随笔為你收集整理的java内存图解_图解JAVA内存模型(JMM:JAVA Memory Model)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。