最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)內(nèi)存模型詳情

 更新時(shí)間:2021年10月22日 08:44:37   作者:onlythinking  
這篇文章主要介紹了Java并發(fā)內(nèi)存模型,Java是一門支持多線程執(zhí)行的語(yǔ)言,要編寫正確的并發(fā)程序,了解Java內(nèi)存模型是重要前提。而了解硬件內(nèi)存模型有助于理解程序的執(zhí)行,下面文章就來(lái)看看詳細(xì)內(nèi)容吧

Java是一門支持多線程執(zhí)行的語(yǔ)言,要編寫正確的并發(fā)程序,了解Java內(nèi)存模型是重要前提。而了解硬件內(nèi)存模型有助于理解程序的執(zhí)行。

本文主要整理以下內(nèi)容

  • Java內(nèi)存模型
  • 硬件內(nèi)存架構(gòu)
  • 共享對(duì)象可見性
  • 競(jìng)爭(zhēng)條件

1、Java內(nèi)存模型

Java內(nèi)存模型最新修訂是在Java5。 JSR-176 羅列了 J2SE5.0 相關(guān)發(fā)布特性,包含其中的 JSR-133(JavaTM內(nèi)存模型與線程規(guī)范),java虛擬機(jī)遵循此規(guī)范。延續(xù)至今該內(nèi)存模型在Java8中依然奏效。

JSR 全稱 Java Specification Requests,意為Java標(biāo)準(zhǔn)化技術(shù)規(guī)范的正式請(qǐng)求。

Java程序運(yùn)行在虛擬機(jī)上(Jvm)。從邏輯角度看,Jvm內(nèi)存被劃分為線程堆棧和堆。每個(gè)線程都擁有自己的堆棧,該線程堆棧存儲(chǔ)的數(shù)據(jù)不對(duì)其它線程可見。堆內(nèi)存用于存儲(chǔ)共享數(shù)據(jù)。

線程堆棧存儲(chǔ)方法中所有局部變量,包含原始類型(boolean,byteshort,char,int,long, floatdouble)和對(duì)象引用。

堆存儲(chǔ)需要共享對(duì)象和靜態(tài)變量。

注意:對(duì)象不一定都會(huì)存儲(chǔ)到堆內(nèi)存??聪旅胬?,假如果Object對(duì)象不需要被其它線程共享,編譯器會(huì)執(zhí)行堆分配轉(zhuǎn)化為棧分配。

解釋一下,編譯器會(huì)根據(jù)對(duì)象是否逃逸做出優(yōu)化。優(yōu)化的其中一項(xiàng)就是堆分配轉(zhuǎn)化為棧分配,目的在于減輕GC壓力,提升性能。此優(yōu)化動(dòng)作由Jvm參數(shù)-XX:+DoEscapeAnalysi 進(jìn)行控制。Java8 默認(rèn)開啟。

測(cè)試:通過(guò)開啟或關(guān)閉 -XX:+PrintGC -XX:-DoEscapeAnalysis 觀察是否執(zhí)行GC來(lái)判斷對(duì)象存儲(chǔ)位置。

public static void main(String[] args){
     for(int i = 0; i < 10000000; i++){
         createObj();
     }
 }
 public static void createObj(){
     new Object();
 }


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

如下圖,現(xiàn)代計(jì)算機(jī)通常都裝有2個(gè)或者更多的CPU,CPU又可以是多核。一個(gè)CPU包含一組寄存器,每個(gè)CPU具有一個(gè)高速緩存,而高速緩存又分為L(zhǎng)1,L2,L3,L4 不同層級(jí)緩存。

RAM為主存儲(chǔ)也就是我們說(shuō)的計(jì)算機(jī)內(nèi)存,所有CPU都可以讀取主存儲(chǔ)。

當(dāng)CPU讀取主存儲(chǔ)數(shù)據(jù)時(shí),它會(huì)將部分主存儲(chǔ)數(shù)據(jù)讀入CPU高速緩存中,又將緩存的中一部分讀入寄存器執(zhí)行,操作結(jié)束后,將值從寄存器刷新到高速緩存中,高速緩存在特定的時(shí)刻將數(shù)據(jù)統(tǒng)一刷新到內(nèi)存中。

3、實(shí)際執(zhí)行

事實(shí)上,上面闡述的Java堆棧內(nèi)存模型是為了理解抽象出來(lái)的。實(shí)際執(zhí)行就像下圖一樣,線程棧和堆的數(shù)據(jù)可能分散到硬件不同的存儲(chǔ)區(qū)域。數(shù)據(jù)分散在不同區(qū)域會(huì)帶來(lái)以下兩個(gè)主要問(wèn)題。

3.1 共享對(duì)象可見性

下面場(chǎng)景兩個(gè)線程同時(shí)操作對(duì)象obj.count,其中一個(gè)線程對(duì)obj.count進(jìn)行更新,但是對(duì)其它線程不可見。

線程A操作obj時(shí),先從主存里拷貝一個(gè)數(shù)據(jù)副本到CPU高速緩存,又到寄存器,然后修改obj.count=2后刷新到CPU高速緩存,但是數(shù)據(jù)暫未同步到主存。以此同時(shí)線程B也操作obj,拷貝的數(shù)據(jù)副本仍然為obj.count=1,這會(huì)導(dǎo)致程序結(jié)果錯(cuò)誤。

解決此問(wèn)題,可以使用Java volatile關(guān)鍵字。volatile可簡(jiǎn)單理解為跳過(guò)CPU高速緩存,讓修改結(jié)果及時(shí)同步到主存,從而保證了其它線程讀到最新值。volatile 后期專門介紹。

3.2 競(jìng)爭(zhēng)條件

另外一種情況假如果多個(gè)線程同時(shí)更行obj.count,這時(shí)會(huì)發(fā)生競(jìng)爭(zhēng)條件。

解決方法,使用Java synchronized 保證線程執(zhí)行順序,另外synchronized包裹中的所有變量都直接從主存讀?。ㄌ^(guò)CPU高速緩存),并且當(dāng)線程退出synchronized后,所有更新的變量將同步到主存。

總結(jié):

本文記錄Java內(nèi)存模型,其中主要內(nèi)容來(lái)源于 Jakob Jenkov 大神博客。

   http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

到此這篇關(guān)于Java并發(fā)內(nèi)存模型詳情的文章就介紹到這了,更多相關(guān)Java并發(fā)內(nèi)存模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java合并兩個(gè)及以上有序鏈表的示例詳解

    Java合并兩個(gè)及以上有序鏈表的示例詳解

    這篇文章主要通過(guò)兩個(gè)例題為大家介紹一下Java合并兩個(gè)及以上有序鏈表的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2022-11-11
  • SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud Eureka 提供者及調(diào)用者的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 詳解spring中aop不生效的幾種解決辦法

    詳解spring中aop不生效的幾種解決辦法

    這篇文章主要介紹了詳解spring中aop不生效的幾種解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java8 集合之Stack詳解及實(shí)例

    java8 集合之Stack詳解及實(shí)例

    這篇文章主要介紹了java8 集合之Stack詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java課程設(shè)計(jì)做一個(gè)多人聊天室(socket+多線程)

    java課程設(shè)計(jì)做一個(gè)多人聊天室(socket+多線程)

    這篇文章主要介紹了我的java課程設(shè)計(jì)一個(gè)多人聊天室(socket+多線程)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • @Async異步線程池以及線程的命名方式

    @Async異步線程池以及線程的命名方式

    這篇文章主要介紹了@Async異步線程池以及線程的命名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java實(shí)現(xiàn)在SSM下使用支付寶掃碼支付功能

    java實(shí)現(xiàn)在SSM下使用支付寶掃碼支付功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)在SSM下使用支付寶掃碼支付功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Spring?Boot自動(dòng)配置源碼實(shí)例解析

    Spring?Boot自動(dòng)配置源碼實(shí)例解析

    Spring Boot作為Java領(lǐng)域最為流行的快速開發(fā)框架之一,其核心特性之一就是其強(qiáng)大的自動(dòng)配置機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot自動(dòng)配置源碼的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 計(jì)算機(jī)編程語(yǔ)言發(fā)展史

    計(jì)算機(jī)編程語(yǔ)言發(fā)展史

    這篇文章主要介紹了Java計(jì)算機(jī)編程語(yǔ)言發(fā)展史,編程語(yǔ)言?可以簡(jiǎn)單的理解為一種計(jì)算機(jī)和人都能識(shí)別的語(yǔ)言。一種計(jì)算機(jī)語(yǔ)言讓程序員能夠準(zhǔn)確地定義計(jì)算機(jī)所需要使用的數(shù)據(jù),并精確地定義在不同情況下所應(yīng)當(dāng)采取的行動(dòng),下面詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • 日歷顯示讀出輸入的年月的java代碼

    日歷顯示讀出輸入的年月的java代碼

    這篇文章主要介紹了日歷顯示讀出輸入的年月的java代碼,有需要的朋友可以參考一下
    2013-12-12

最新評(píng)論

西乌珠穆沁旗| 锦屏县| 潞西市| 安龙县| 达尔| 武汉市| 泽库县| 岑巩县| 邵阳市| 金阳县| 革吉县| 汕头市| 光山县| 博野县| 岗巴县| 兴国县| 宜城市| 繁峙县| 泸州市| 犍为县| 阜阳市| 黑山县| 安西县| 武鸣县| 林口县| 临夏县| 兰西县| 和硕县| 兴安县| 黄浦区| 布尔津县| 宜川县| 涟水县| 和硕县| 建湖县| 六盘水市| 东山县| 略阳县| 化德县| 山东省| 蓝山县|