国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試官:說說什么是Java內(nèi)存模型?

大數(shù)據(jù) 數(shù)據(jù)分析
由于CPU 和主內(nèi)存間存在數(shù)量級的速率差,想到了引入了多級高速緩存的傳統(tǒng)硬件內(nèi)存架構(gòu)來解決,多級高速緩存作為 CPU 和主內(nèi)間的緩沖提升了整體性能。解決了速率差的問題,卻又帶來了緩存一致性問題。

[[394166]]

本文轉(zhuǎn)載自微信公眾號「愛笑的架構(gòu)師」,作者雷小帥。轉(zhuǎn)載本文請聯(lián)系愛笑的架構(gòu)師公眾號。   

在面試中,面試官經(jīng)常喜歡問:『說說什么是Java內(nèi)存模型(JMM)?』

面試者內(nèi)心狂喜,這題剛背過:『Java內(nèi)存主要分為五大塊:堆、方法區(qū)、虛擬機(jī)棧、本地方法棧、PC寄存器,balabala……』

面試官會心一笑,露出一道光芒:『好了,今天的面試先到這里了,回去等通知吧』

一般聽到等通知這句話,這場面試大概率就是涼涼了。為什么呢?因為面試者弄錯了概念,面試官是想考察JMM,但是面試者一聽到Java內(nèi)存這幾個關(guān)鍵字就開始背誦八股文了。Java內(nèi)存模型(JMM)和 Java 運行時內(nèi)存區(qū)域區(qū)別可大了呢,不要走開接著往下看,答應(yīng)我要看完。

為什么要有內(nèi)存模型?

要想回答這個問題,我們需要先弄懂傳統(tǒng)計算機(jī)硬件內(nèi)存架構(gòu)。好了,我要開始畫圖了。

硬件內(nèi)存架構(gòu)

(1)CPU

去過機(jī)房的同學(xué)都知道,一般在大型服務(wù)器上會配置多個CPU,每個CPU還會有多個核,這就意味著多個CPU或者多個核可以同時(并發(fā))工作。如果使用Java 起了一個多線程的任務(wù),很有可能每個 CPU 都會跑一個線程,那么你的任務(wù)在某一刻就是真正并發(fā)執(zhí)行了。

(2)CPU Register

CPU Register也就是 CPU 寄存器。CPU 寄存器是 CPU 內(nèi)部集成的,在寄存器上執(zhí)行操作的效率要比在主存上高出幾個數(shù)量級。

(3)CPU Cache Memory

CPU Cache Memory也就是 CPU 高速緩存,相對于寄存器來說,通常也可以成為 L2 二級緩存。相對于硬盤讀取速度來說內(nèi)存讀取的效率非常高,但是與 CPU 還是相差數(shù)量級,所以在 CPU 和主存間引入了多級緩存,目的是為了做一下緩沖。

(4)Main Memory

Main Memory 就是主存,主存比 L1、L2 緩存要大很多。

注意:部分高端機(jī)器還有 L3 三級緩存。

緩存一致性問題

由于主存與 CPU 處理器的運算能力之間有數(shù)量級的差距,所以在傳統(tǒng)計算機(jī)內(nèi)存架構(gòu)中會引入高速緩存來作為主存和處理器之間的緩沖,CPU 將常用的數(shù)據(jù)放在高速緩存中,運算結(jié)束后 CPU 再講運算結(jié)果同步到主存中。

使用高速緩存解決了 CPU 和主存速率不匹配的問題,但同時又引入另外一個新問題:緩存一致性問題。

在多CPU的系統(tǒng)中(或者單CPU多核的系統(tǒng)),每個CPU內(nèi)核都有自己的高速緩存,它們共享同一主內(nèi)存(Main Memory)。當(dāng)多個CPU的運算任務(wù)都涉及同一塊主內(nèi)存區(qū)域時,CPU 會將數(shù)據(jù)讀取到緩存中進(jìn)行運算,這可能會導(dǎo)致各自的緩存數(shù)據(jù)不一致。

因此需要每個 CPU 訪問緩存時遵循一定的協(xié)議,在讀寫數(shù)據(jù)時根據(jù)協(xié)議進(jìn)行操作,共同來維護(hù)緩存的一致性。這類協(xié)議有 MSI、MESI、MOSI、和 Dragon Protocol 等。

處理器優(yōu)化和指令重排序

為了提升性能在 CPU 和主內(nèi)存之間增加了高速緩存,但在多線程并發(fā)場景可能會遇到緩存一致性問題。那還有沒有辦法進(jìn)一步提升 CPU 的執(zhí)行效率呢?答案是:處理器優(yōu)化。

為了使處理器內(nèi)部的運算單元能夠最大化被充分利用,處理器會對輸入代碼進(jìn)行亂序執(zhí)行處理,這就是處理器優(yōu)化。

除了處理器會對代碼進(jìn)行優(yōu)化處理,很多現(xiàn)代編程語言的編譯器也會做類似的優(yōu)化,比如像 Java 的即時編譯器(JIT)會做指令重排序。

處理器優(yōu)化其實也是重排序的一種類型,這里總結(jié)一下,重排序可以分為三種類型:

  • 編譯器優(yōu)化的重排序。編譯器在不改變單線程程序語義放入前提下,可以重新安排語句的執(zhí)行順序。
  • 指令級并行的重排序。現(xiàn)代處理器采用了指令級并行技術(shù)來將多條指令重疊執(zhí)行。如果不存在數(shù)據(jù)依賴性,處理器可以改變語句對應(yīng)機(jī)器指令的執(zhí)行順序。
  • 內(nèi)存系統(tǒng)的重排序。由于處理器使用緩存和讀寫緩沖區(qū),這使得加載和存儲操作看上去可能是在亂序執(zhí)行。

并發(fā)編程的問題

上面講了一堆硬件相關(guān)的東西,有些同學(xué)可能會有點懵,繞了這么大圈,這些東西跟 Java 內(nèi)存模型有啥關(guān)系嗎?不要急咱們慢慢往下看。

熟悉 Java 并發(fā)的同學(xué)肯定對這三個問題很熟悉:『可見性問題』、『原子性問題』、『有序性問題』。如果從更深層次看這三個問題,其實就是上面講的『緩存一致性』、『處理器優(yōu)化』、『指令重排序』造成的。

緩存一致性問題其實就是可見性問題,處理器優(yōu)化可能會造成原子性問題,指令重排序會造成有序性問題,你看是不是都聯(lián)系上了。

出了問題總是要解決的,那有什么辦法呢?首先想到簡單粗暴的辦法,干掉緩存讓 CPU 直接與主內(nèi)存交互就解決了可見性問題,禁止處理器優(yōu)化和指令重排序就解決了原子性和有序性問題,但這樣一夜回到解放前了,顯然不可取。

所以技術(shù)前輩們想到了在物理機(jī)器上定義出一套內(nèi)存模型, 規(guī)范內(nèi)存的讀寫操作。內(nèi)存模型解決并發(fā)問題主要采用兩種方式:限制處理器優(yōu)化和使用內(nèi)存屏障。

Java 內(nèi)存模型

同一套內(nèi)存模型規(guī)范,不同語言在實現(xiàn)上可能會有些差別。接下來著重講一下 Java 內(nèi)存模型實現(xiàn)原理。

Java 運行時內(nèi)存區(qū)域與硬件內(nèi)存的關(guān)系

了解過 JVM 的同學(xué)都知道,JVM 運行時內(nèi)存區(qū)域是分片的,分為棧、堆等,其實這些都是 JVM 定義的邏輯概念。在傳統(tǒng)的硬件內(nèi)存架構(gòu)中是沒有棧和堆這種概念。

從圖中可以看出棧和堆既存在于高速緩存中又存在于主內(nèi)存中,所以兩者并沒有很直接的關(guān)系。

Java 線程與主內(nèi)存的關(guān)系

Java 內(nèi)存模型是一種規(guī)范,定義了很多東西:

  • 所有的變量都存儲在主內(nèi)存(Main Memory)中。
  • 每個線程都有一個私有的本地內(nèi)存(Local Memory),本地內(nèi)存中存儲了該線程以讀/寫共享變量的拷貝副本。
  • 線程對變量的所有操作都必須在本地內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存。
  • 不同的線程之間無法直接訪問對方本地內(nèi)存中的變量。

看文字太枯燥了,我又畫了一張圖:

線程間通信

如果兩個線程都對一個共享變量進(jìn)行操作,共享變量初始值為 1,每個線程都變量進(jìn)行加 1,預(yù)期共享變量的值為 3。在 JMM 規(guī)范下會有一系列的操作。

為了更好的控制主內(nèi)存和本地內(nèi)存的交互,Java 內(nèi)存模型定義了八種操作來實現(xiàn):

  • lock:鎖定。作用于主內(nèi)存的變量,把一個變量標(biāo)識為一條線程獨占狀態(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)存的變量副本中。
  • use:使用。作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個變量值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個需要使用變量的值的字節(jié)碼指令時將會執(zhí)行這個操作。
  • assign:賦值。作用于工作內(nèi)存的變量,它把一個從執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。
  • store:存儲。作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個變量的值傳送到主內(nèi)存中,以便隨后的write的操作。
  • write:寫入。作用于主內(nèi)存的變量,它把store操作從工作內(nèi)存中一個變量的值傳送到主內(nèi)存的變量中。

注意:工作內(nèi)存也就是本地內(nèi)存的意思。

有態(tài)度的總結(jié)

由于CPU 和主內(nèi)存間存在數(shù)量級的速率差,想到了引入了多級高速緩存的傳統(tǒng)硬件內(nèi)存架構(gòu)來解決,多級高速緩存作為 CPU 和主內(nèi)間的緩沖提升了整體性能。解決了速率差的問題,卻又帶來了緩存一致性問題。

數(shù)據(jù)同時存在于高速緩存和主內(nèi)存中,如果不加以規(guī)范勢必造成災(zāi)難,因此在傳統(tǒng)機(jī)器上又抽象出了內(nèi)存模型。

Java 語言在遵循內(nèi)存模型的基礎(chǔ)上推出了 JMM 規(guī)范,目的是解決由于多線程通過共享內(nèi)存進(jìn)行通信時,存在的本地內(nèi)存數(shù)據(jù)不一致、編譯器會對代碼指令重排序、處理器會對代碼亂序執(zhí)行等帶來的問題。

為了更精準(zhǔn)控制工作內(nèi)存和主內(nèi)存間的交互,JMM 還定義了八種操作:lock, unlock, read, load,use,assign, store, write。

 

責(zé)任編輯:武曉燕 來源: 愛笑的架構(gòu)師
相關(guān)推薦

2021-08-24 08:05:41

泛型類型擦除Class

2020-07-22 08:05:44

中間人攻擊

2024-02-22 15:36:23

Java內(nèi)存模型線程

2021-09-07 10:44:33

Java 注解開發(fā)

2025-04-01 00:00:00

項目CRUD單例模式

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構(gòu)

2024-07-26 08:10:10

2023-12-19 09:24:22

LinuxBIOSUEFI

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-02-21 07:40:17

JVM內(nèi)存虛擬機(jī)

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級別幻讀

2024-08-29 16:30:27

2025-04-08 00:00:00

@AsyncSpring異步

2024-08-12 17:36:54

2025-04-16 00:00:01

JWT客戶端存儲加密令

2020-12-01 08:47:36

Java異常開發(fā)

2021-12-08 06:53:29

面試動態(tài)代理
點贊
收藏

51CTO技術(shù)棧公眾號

97视频人免费观看| 国产成人在线视频网址| 香蕉视频禁止18| 伊人亚洲福利一区二区三区| 欧美性极品少妇精品网站| 亚洲在线视频一区| 亚洲激情在线播放| 国产精品久久久久久久岛一牛影视| 成人性生交大合| 国产精品中文字幕日韩精品| 精品亚洲porn| 久久久久久久久久久黄色| 国产精品国产三级国产有无不卡 | 欧美日韩第一| 欧美ab在线视频| 亚洲网站在线| 亚洲大片av| 九九视频精品免费| 亚洲午夜精品网| 欧美综合在线视频| 精品国产三级a在线观看| 一本色道久久88精品综合| 一区二区三区四区精品| 97在线精品视频| 亚洲mv在线看| 激情丁香婷婷| 污香蕉视频在线观看| 欧美精品videos另类| 中文字幕有码在线观看| 日本成人片在线| 网红女主播少妇精品视频| 国产剧情在线观看一区| 国产欧美69| 国产精品色婷婷久久58| 日韩一区二区三区在线观看| 欧美巨乳美女视频| 国产精品二区三区四区| 国产淫片av片久久久久久| 大陆av在线播放| 成人禁在线观看网站| 日韩精品系列| 久青青在线观看视频国产| 亚洲男人都懂的网站| 国产一二三区在线| 在线heyzo| 欧美福利在线播放| 操欧美女人视频| 亚洲精品a级片| 久久国产精品亚洲人一区二区三区| 久久99国产精品视频| 日韩欧美2区| 国产精品白丝久久av网站| 韩国亚洲精品| 日本一区二区动态图| 欧美高清一级片在线| 18一19gay欧美视频网站| 欧美福利一区二区三区| 成人网址大全| porn亚洲| 蜜芽在线免费观看| 亚洲熟妇无码av在线播放| 国产综合动作在线观看| 国产精品免费网站| 日韩av大片免费看| 成人看片人aa| 国产一区再线| 亚洲图片都市激情| 欧美日本视频在线观看| 国产aaaaa毛片| 在线观看入口黄最新永久免费国产| 麻豆网站在线| 欧美大片高清| 国产不卡av一区二区| 精品av一区二区| 日韩福利电影在线观看| 久久综合九色综合欧美就去吻| 91麻豆精品国产91久久久使用方法 | 九色国产在线观看| 345成人影院| 丁香另类激情小说| 国产亚洲精品免费| 午夜欧美在线一二页| 久久久久久久久久久久久久久久久久av | 国产99久久精品一区二区永久免费| 日本a级片电影一区二区| 91文字幕巨乱亚洲香蕉| 精品国产一区二区三区无码| 午夜在线观看91| 国产美女福利在线观看| 国产精品毛片aⅴ一区二区三区| 日本亚洲欧洲无免费码在线| 妖精视频一区二区三区| 激情视频一区二区三区| a级高清视频欧美日韩| 在线亚洲精品福利网址导航| 久久色精品视频| 91精品一区二区| 国家队第一季免费高清在线观看| 秋霞影院一区二区三区| 国产成人免费视频精品含羞草妖精| 欧美日韩亚洲视频| 国产精品青青在线观看爽香蕉| 美女在线视频一区二区| 欧美禁忌电影| 色婷婷久久久亚洲一区二区三区| 成人妇女淫片aaaa视频| av资源网站在线观看| 蜜桃视频在线观看一区| 日韩av网站大全| 欧美亚洲国产免费| 在线免费日韩片| 久久亚洲二区三区| 91精品国产网站| 91最新在线| 亚洲三级观看| 亚洲人成网站色在线观看| 91久久在线观看| gogo高清在线播放免费| 国产一区二区三区国产| 午夜免费久久久久| 天天爽夜夜爽一区二区三区| 精品国产91| 尤物九九久久国产精品的分类| 国产日产欧美精品| 日韩免费啪啪| 国产成人亚洲精品青草天美| 日本高清不卡在线| 91精品大全| 成人午夜av电影| 亚洲最大福利视频网| 一区二区三区短视频| 亚洲一区二区偷拍精品| 国产一区二区三区四区五区在线 | 国产乱子精品一区二区在线观看| 中文字幕高清一区| 国精产品99永久一区一区| 日本一区二区三区视频在线看| 欧美午夜片在线免费观看| 精品乱码一区二区三区| 91亚洲精选| 亚洲少妇30p| 中文字幕免费高| 中文字幕一区二区三区日韩精品| 色综合久久88色综合天天| 91猫先生在线| 日韩av中文在线观看| 欧美激情国产精品| 高清电影在线观看免费| 91黄视频在线| 伊人发布在线| 成人一区二区三区中文字幕| 欧美日韩日本网| 欧美/亚洲一区| 国产成人短视频| 亚洲精品mv| 欧美精品一区二区三区四区| 欧美18xxxxx| ㊣最新国产の精品bt伙计久久| 成人网站免费观看入口| 欧美在线日韩| 国产精品啪视频| 蜜臀av免费一区二区三区 | 日本高清久久天堂| 久久国产精品免费一区二区三区| 婷婷开心激情综合| 1区不卡电影| 99久久国产综合色|国产精品| 日本免费高清一区| 亚洲乱码精品| 成人在线视频电影| 红桃视频欧美| 日本韩国欧美精品大片卡二| 亚洲日本va午夜在线电影| 亚洲国产精品va在线看黑人| 免费在线观看麻豆视频| 国产99久久久国产精品免费看 | 亚洲欧洲在线视频| 1234区中文字幕在线观看| 精品伦理精品一区| a级片免费在线观看| 亚洲精品日韩久久久| 91在线不卡| 日韩精品中文字幕久久臀| 国精产品一区一区三区四川| 欧美丰满一区二区免费视频 | 亚洲自拍偷拍区| 成人羞羞视频在线看网址| 国产精品入口夜色视频大尺度 | 亚洲午夜未删减在线观看 | 中文字幕亚洲影视| 欧美精品久久久久久久久| 欧美成人资源| 亚洲精品一区二区三区香蕉| 国产精品一区二区婷婷| 高跟丝袜一区二区三区| 天堂av在线播放| 欧美主播一区二区三区| 又黄又爽在线观看| 欧美日韩一区精品| 3d性欧美动漫精品xxxx软件|