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

java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系

這篇具有很好參考價值的文章主要介紹了java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系,java八股文,面試,職場和發(fā)展

JAVA內(nèi)存模型(JMM)
共享變量:如果一個變量在多個線程的工作內(nèi)存中都存在副本,那么這個變量就是這幾個線程的共享變量。
上面的工作內(nèi)存其實是java內(nèi)存模型抽象出來的概念,下面簡要介紹一下java內(nèi)存模型(JMM)。
java內(nèi)存模型(java memory model): 描述了java程序中各種變量(線程共享變量)的訪問規(guī)則,以及在JVM中將變量存儲到內(nèi)存和從內(nèi)存中讀取出變量這樣的底層細節(jié)。

不同的平臺,內(nèi)存模型是不一樣的,我們可以把內(nèi)存模型理解為在特定操作協(xié)議下,對特定的內(nèi)存高速緩存進行讀寫訪問的過程抽象。Java 虛擬機規(guī)范中試圖定義一種 Java 內(nèi)存模型(Java Memory Model,簡稱 JMM)屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,以實現(xiàn)讓 Java 程序在各種平臺下都能達到一致的內(nèi)存訪問效果,不必因為不同平臺上的物理機的內(nèi)存模型的差異,對各平臺定制化開發(fā)程序。
更具體一點說,Java 內(nèi)存模型提出目標在于,定義程序中各個變量的訪問規(guī)則,即在虛擬機中將變量存儲到內(nèi)存和從內(nèi)存中取出變量這樣的底層細節(jié)。

java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系,java八股文,面試,職場和發(fā)展

?

從上圖可以得出結(jié)論:

  • 所有的變量都存儲在主內(nèi)存
  • 每個線程都有自己獨立的工作內(nèi)存,里面保存該線程使用到的變量的副本(主內(nèi)存該變量的一份拷貝)。

JMM關(guān)于synchronized的兩條規(guī)定:

  1. 線程解鎖前,必須把共享變量的最新值刷新到主內(nèi)存中
  2. 線程加鎖時,將清空工作內(nèi)存中共享變量的值,從而使用共享變量時需要從主內(nèi)存中重新讀取最新的值。(加鎖和解鎖需要是同一把鎖)

線程解鎖前對共享變量的修改在下次加鎖前對其他線程可見。

JVM主內(nèi)存與工作內(nèi)存描述

JVM將內(nèi)存為主內(nèi)存工作內(nèi)存兩個部分。

主內(nèi)存:?主要包括本地方法區(qū)和?

  • Java 內(nèi)存模型規(guī)定了所有變量都存儲在主內(nèi)存(Main Memory)中(此處的主內(nèi)存與介紹物理硬件的主內(nèi)存名字一樣,兩者可以互相類比,但此處僅是虛擬機內(nèi)存的一部分)。

工作內(nèi)存:?每個線程都有一個工作內(nèi)存,工作內(nèi)存中主要包括兩個部分,一個是屬于該線程私有的和?對主存部分變量拷貝的寄存器(包括程序計數(shù)器PC和cup工作的高速緩存區(qū))。

  • 每個線程都有自己的工作內(nèi)存(Working Memory,又稱本地內(nèi)存.),線程的工作內(nèi)存中保存了該線程使用到的變量,該變量是主內(nèi)存中的共享變量的副本拷貝
  • (工作內(nèi)存是 JMM 的一個抽象概念,并不真實存在。它涵蓋了緩存,寫緩沖區(qū),寄存器以及其他的硬件和編譯器優(yōu)化。)

java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系,java八股文,面試,職場和發(fā)展

?線程執(zhí)行的時候,將首先從主內(nèi)存讀值,再load到工作內(nèi)存中的副本中,然后傳給處理器執(zhí)行,執(zhí)行完畢后再給工作內(nèi)存中的副本賦值,隨后工作內(nèi)存再把值傳回給主存,主存中的值才更新。
在這個過程中如果出現(xiàn)多個線程同時在處理這些值,豈不是會出現(xiàn)并發(fā)問題?

java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系,java八股文,面試,職場和發(fā)展

1、所有的變量都存儲在主內(nèi)存中(虛擬機內(nèi)存的一部分),對于所有線程都是共享的
2、每個線程都有自己的工作內(nèi)存,工作內(nèi)存中保存的是主存中某些變量的值的副本拷貝,線程對變量的所有操作都必須在工作內(nèi)存中進行,不能直接讀寫主內(nèi)存中的變量。
3、線程之間無法直接訪問對方的工作內(nèi)存中的變量值的,線程間變量的傳遞均需要通過主內(nèi)存來完成。
這種劃分與Java運行時內(nèi)存區(qū)域中堆、棧、元空間等的劃分是不同層次的劃分,兩者基本沒有關(guān)系。硬要聯(lián)系的話,大致上主內(nèi)存對應(yīng)Java堆中對象的實例數(shù)據(jù)部分、工作內(nèi)存對應(yīng)棧的部分區(qū)域;從更低層次上說,主內(nèi)存對應(yīng)物理硬件內(nèi)存、工作內(nèi)存對應(yīng)寄存器和高速緩存。

JVM內(nèi)存間交互規(guī)則

關(guān)于主內(nèi)存與工作內(nèi)存之間的具體交互協(xié)議,即一個變量如何從主內(nèi)存拷貝到工作內(nèi)存、如何從工作內(nèi)存同步回主內(nèi)存之類的實現(xiàn)細節(jié),Java 內(nèi)存模型中定義了下面 8 種操作來完成。
java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系,java八股文,面試,職場和發(fā)展

  1. Lock(鎖定):作用于主內(nèi)存中的變量,把一個變量標識為被一個線程獨占的狀態(tài)。
  2. Unlock(解鎖):作用于主內(nèi)存中的變量, 將一個變量從鎖定狀態(tài)(Lock)釋放出來,釋放后的變量才可以被其他線程鎖定(Lock)
  3. Read(讀取):作用于主內(nèi)存中的變量,將一個變量的值從主內(nèi)存?zhèn)鬏數(shù)焦ぷ鲀?nèi)存中,以便隨后的load操作使用
  4. Load(加載):作用于工作內(nèi)存中的變量,把read操作從主內(nèi)存中得到的變量的值放入工作內(nèi)存的變量副本中。
  5. Use(使用):作用于工作內(nèi)存中的變量,把工作內(nèi)存中一個變量的值傳遞給執(zhí)行引擎。(每當虛擬機遇到一個需要使用到變量的值的字節(jié)碼指令時就會執(zhí)行這個操作。)
  6. Assign(賦值):作用于工作內(nèi)存中的變量,把一個從執(zhí)行引擎接收到的值賦值給工作內(nèi)存中的變量。(每當虛擬機遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。)
  7. Store(存儲):作用于工作內(nèi)存中的變量,把工作內(nèi)存中的一個變量的值傳送到主內(nèi)存中,以便隨后 write 操作使用。
  8. Write(寫入):作用于主內(nèi)存中的變量,把store操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。

需知:

  • 在將變量從主內(nèi)存讀取到工作內(nèi)存中,必須順序執(zhí)行read(讀取)、load(加載)
  • 要將變量從工作內(nèi)存同步回主內(nèi)存中,必須順序執(zhí)行store(存儲)、write(寫入)。

這8種操作必須遵循以下規(guī)則:

  1. 不允許read(讀取)和load(加載)、store(存儲)和write(寫入)操作之一單獨出現(xiàn)。即不允許一個變量從主內(nèi)存被讀取了,但是工作內(nèi)存不接受,或者從工作內(nèi)存回寫了但是主內(nèi)存不接受。

    不允許一個線程無原因地(沒有發(fā)生過任何assign操作)把數(shù)據(jù)從工作內(nèi)存同步會主內(nèi)存中

  2. 不允許一個線程丟棄它最近的一個assign(賦值)操作,即變量在工作內(nèi)存被更改后必須同步改更改回主內(nèi)存。即:執(zhí)行store(存儲),write(寫入)操作

  3. 工作內(nèi)存中的變量在沒有執(zhí)行過assign(賦值)操作時,不允許無意義的同步回主內(nèi)存。 即:執(zhí)行store(存儲),write(寫入)操作

  4. 在執(zhí)行use(使用)前必須已執(zhí)行load(加載),在執(zhí)行store(存儲)前必須已執(zhí)行assign(賦值)。

  5. 一個變量在同一時刻只允許一個線程對其執(zhí)行l(wèi)ock操作,一個線程可以對同一個變量重復(fù)執(zhí)行多次lock,多次執(zhí)行l(wèi)ock后,只有執(zhí)行相同次數(shù)的unlock操作,變量才會被解鎖。lock和unlock必須成對出現(xiàn)。

  6. 一個線程在lock一個變量的時候,將會清空工作內(nèi)存中的此變量的值,執(zhí)行引擎在use(使用)前必須重新read(讀取)和load(加載)初始化變量的值。

  7. 在執(zhí)行unlock之前,必須首先執(zhí)行了store(存儲)和write(寫入)操作

    對一個變量執(zhí)行unlock操作之前,必須先把此變量同步到主內(nèi)存中(執(zhí)行store和write操作)

  8. 線程不允許unlock其他線程lock操作。并且unlock操作必須是在本線程的lock操作之后。

    如果一個變量事先沒有被lock操作鎖定,則不允許對它執(zhí)行unlock操作;也不允許去unlock一個被其他線程鎖定的變量。

從上面可以看出,把變量從主內(nèi)存復(fù)制到工作內(nèi)存需要順序執(zhí)行read、load,從工作內(nèi)存同步回主內(nèi)存則需要順序執(zhí)行store、write??偨Y(jié):

  • read、load、use必須成對順序出現(xiàn),但不要求連續(xù)出現(xiàn)。assign、store、write同之;
  • 變量誕生和初始化:變量只能從主內(nèi)存“誕生”,且須先初始化后才能使用,即在use/store前須先load/assign;
  • lock一個變量后會清空工作內(nèi)存中該變量的值,使用前須先初始化;unlock前須將變量同步回主內(nèi)存;
  • 一個變量同一時刻只能被一線程lock,lock幾次就須unlock幾次;未被lock的變量不允許被執(zhí)行unlock,一個線程不能去unlock其他線程lock的變量。

JVM先行發(fā)生原則

Java內(nèi)存模型具備一些先天的“有序性”,即不需要通過任何同步手段(volatile、synchronized等)就能夠得到保證的有序性,這個通常也稱為happens-before原則。

?

知識來源:

【23版面試突擊】你知道主內(nèi)存和工作內(nèi)存的關(guān)系?_嗶哩嗶哩_bilibili

【Java多線程】內(nèi)存模型JMM—主內(nèi)存與工作內(nèi)存分析_主內(nèi)存和工作內(nèi)存_Archie_java的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-683910.html

到了這里,關(guān)于java八股文面試[多線程]——主內(nèi)存和工作內(nèi)存的關(guān)系的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • java八股文面試[多線程]——synchronized鎖升級過程

    java八股文面試[多線程]——synchronized鎖升級過程

    速記:偏向-輕量-重量 上面講到鎖有四種狀態(tài),并且會因?qū)嶋H情況進行膨脹升級,其膨脹方向是: 無鎖——偏向鎖——輕量級鎖——重量級鎖 ,并且膨脹方向 不可逆 一.鎖升級理論. 在synchronized鎖升級過程中涉及到以下幾種鎖.先說一下這幾種鎖是什么意思. 偏向鎖: 只有一個

    2024年02月10日
    瀏覽(25)
  • java八股文面試[多線程]——Synchronized的底層實現(xiàn)原理

    java八股文面試[多線程]——Synchronized的底層實現(xiàn)原理

    筆試:畫出Synchronized 線程狀態(tài)流轉(zhuǎn) 實現(xiàn)原理圖 synchronized解決的是多個線程之間訪問資源的同步性,synchronized 翻譯為中文的意思是 同步 ,也稱之為”同步鎖“。 synchronized的作用是保證在 同一時刻 , 被修飾的代碼塊或方法只會有一個線程執(zhí)行,以達到保證并發(fā)安全的

    2024年02月10日
    瀏覽(25)
  • java八股文面試[多線程]——并發(fā)三大特性 原子 可見 順序

    java八股文面試[多線程]——并發(fā)三大特性 原子 可見 順序

    ? ? AutomicInteger :? volatile + CAS 總線LOCK? MESI 兩個協(xié)議 TODO volatile的可見性和禁止重排序是怎么實現(xiàn)的: DCL場景:? new操作會在字節(jié)碼層面生成兩個步驟: 分配內(nèi)存、調(diào)用構(gòu)造器 然后把引用賦值給singleton 不加volatile則會發(fā)生指令重排,可能得到不完整的對象 知識來源: 【并

    2024年02月11日
    瀏覽(25)
  • java八股文面試[多線程]——synchronized鎖升級詳細流程

    java八股文面試[多線程]——synchronized鎖升級詳細流程

    偏向鎖是JDK6中的重要引進,因為HotSpot作者經(jīng)過研究實踐發(fā)現(xiàn),在大多數(shù)情況下,鎖不僅不存在多線程競爭,而且總是由 同一線程多次獲得 ,為了讓線程獲得鎖的代價更低,引進了偏向鎖。 偏向鎖是在 單線程 執(zhí)行代碼塊時使用的機制,如果在多線程并發(fā)的環(huán)境下(即線程

    2024年02月10日
    瀏覽(25)
  • java八股文面試[多線程]——兩個線程交替打印1-100之間的數(shù)字

    一份代碼,兩個線程,使用synchronize實現(xiàn): 重寫run()方法,將輸出1到100之間整數(shù)的代碼寫到同步方法里。 線程1進入到同步方法,輸出一個整數(shù)后,阻塞并釋放鎖。 線程2進入到同步方法,喚醒線程1,輸出整數(shù)后,阻塞并釋放鎖。 線程1和線程2重復(fù)第3步,直到輸出所有的整數(shù)

    2024年02月11日
    瀏覽(23)
  • java八股文面試[多線程]——ThreadLocal底層原理和使用場景

    java八股文面試[多線程]——ThreadLocal底層原理和使用場景

    源碼分析: ThreadLocal中定義了ThreadLocalMap靜態(tài)內(nèi)部類,該內(nèi)部類中又定義了Entry內(nèi)部類。 ThreadLocalMap定了 Entry數(shù)組。 Set方法: Get方法: Thread中定義了兩個ThreaLocalMap成員變量: Spring使用ThreadLocal解決線程安全問題? 我們知道在一般情況下,只有 無狀態(tài)的Bean 才可以在多線程環(huán)

    2024年02月10日
    瀏覽(24)
  • java八股文面試[多線程]——為什么要用線程池、線程池參數(shù)

    java八股文面試[多線程]——為什么要用線程池、線程池參數(shù)

    ?速記7個: 核心、最大 存活2 隊列 工廠 拒絕 線程池處理流程: 線程池底層工作原理: 線程復(fù)用原理: ? 知識來源: 【并發(fā)與線程】為什么使用線程池,參數(shù)解釋_嗶哩嗶哩_bilibili 【并發(fā)與線程】線程池處理流程_嗶哩嗶哩_bilibili 【并發(fā)與線程】線程池的底層工作原理_嗶哩

    2024年02月11日
    瀏覽(23)
  • java八股文面試[多線程]——sleep wait join yield

    java八股文面試[多線程]——sleep wait join yield

    ? ? ? sleep和wait有什么區(qū)別 sleep 方法和 wait 方法都是用來將線程進入 阻塞狀態(tài) 的,并且 sleep 和 wait 方法都可以響應(yīng) interrupt 中斷,也就是線程在休眠的過程中,如果收到中斷信號,都可以進行響應(yīng)并中斷,且都可以拋出 InterruptedException 異常,那 sleep 和 wait 有什么區(qū)別呢?

    2024年02月11日
    瀏覽(21)
  • 【面試系列】八股文之線程篇202306

    【面試系列】八股文之線程篇202306

    union all :包含重復(fù)行 union :不包含重復(fù)行 shutdown() ,調(diào)用shutdown方法,線程池會拒絕接收新的任務(wù),處理中的任務(wù)和阻塞隊列中的任務(wù)會繼續(xù)處理。 shutdownNow() ,會給workers中所有的線程發(fā)送 interrupt 信號,將延遲隊列的任務(wù)移除并返回。 原理分析 執(zhí)行任務(wù),嘗試添加線程。

    2024年02月12日
    瀏覽(24)
  • 【面試八股文】每日一題:談?wù)勀銓€程的理解

    【面試八股文】每日一題:談?wù)勀銓€程的理解

    每日一題-Java核心-談?wù)勀銓€程的理解【面試八股文】 ??Java線程是Java程序中的執(zhí)行單元。一個Java程序可以同時運行多個線程,每個線程可以獨立執(zhí)行不同的任務(wù)。線程的執(zhí)行是并發(fā)的,即多個線程可以同時執(zhí)行。 ??Java中的線程有如下的特點 輕量級:線程的創(chuàng)建和銷毀

    2024年02月12日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包