色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java運行時內存區域與硬件內存的關系2

jf_78858299 ? 來源:小牛呼嚕嚕 ? 作者:小牛呼嚕嚕 ? 2023-02-09 14:41 ? 次閱讀

線程間通信

線程間的通信一般有兩種方式進行,一是通過消息傳遞,二是共享內存Java 線程間的通信采用的是共享內存方式,JMM 為共享變量提供了線程間的保障。如果兩個線程都對一個共享變量進行操作,共享變量初始值為 1,每個線程都變量進行加 1,預期共享變量的值為 3。在 JMM 規范下會有一系列的操作。我們直接來看下圖:

在多線程的情況下,對主內存中的共享變量進行操作可能發生線程安全問題,比如:線程 1 和線程 2 同時對同一個共享變量進行操作,執行+1操作,線程 1 、線程2 讀取的共享變量是否是彼此修改前還是修改后的值呢,這個是無法確定的,這種情況和CPU的高速緩存與內存之間的問題非常相似

如何實現主內存與工作內存的變量同步,為了更好的控制主內存和本地內存的交互,Java 內存模型定義了八種操作來實現:

  • lock:鎖定。作用于主內存的變量,把一個變量標識為一條線程獨占狀態。
  • unlock:解鎖。作用于主內存變量,把一個處于鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定。
  • read:讀取。作用于主內存變量,把一個變量值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用
  • load:載入。作用于工作內存的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中。工作內存即本地內存
  • use:使用。作用于工作內存的變量,把工作內存中的一個變量值傳遞給執行引擎,每當虛擬機遇到一個需要使用變量的值的字節碼指令時將會執行這個操作。
  • assign:賦值。作用于工作內存的變量,它把一個從執行引擎接收到的值賦值給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。
  • store:存儲。作用于工作內存的變量,把工作內存中的一個變量的值傳送到主內存中,以便隨后的write的操作。
  • write:寫入。作用于主內存的變量,它把store操作從工作內存中一個變量的值傳送到主內存的變量中。

重溫Java 并發三大特性

原子性

原子性:即一個或者多個操作作為一個整體,要么全部執行,要么都不執行,并且操作在執行過程中不會被線程調度機制打斷;而且這種操作一旦開始,就一直運行到結束,中間不會有任何上下文切換(context switch) 比如:

int i = 0;   //語句1,原子性

i++;         //語句2,非原子性

語句1大家一幕了然,語句2卻許多人容易犯迷糊,i++ 其實可以分為3步:

  1. i 被從局部變量表(內存)取出,
  2. 壓入操作棧(寄存器),操作棧中自增
  3. 使用棧頂值更新局部變量表(寄存器更新寫入內存)

執行上述3個步驟的時候是可以進行線程切換的,或者說是可以被另其他線程的 這3 步打斷的,因此語句2不是一個原子性操作

在 Java 中,可以借助synchronized 、各種 Lock 以及各種原子類實現原子性。synchronized 和各種Lock是通過保證任一時刻只有一個線程訪問該代碼塊,因此可以保證其原子性。各種原子類是利用CAS (compare and swap)操作(可能也會用到 volatile或者final關鍵字)來保證原子操作。

可見性

可見性是指當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程能夠立即看到修改的值。我們來看一個例子:

public class VisibilityTest {
    private boolean flag = true;

    public void change() {
        flag = false;
        System.out.println(Thread.currentThread().getName() + ",已修改flag=false");
    }

    public void load() {
        System.out.println(Thread.currentThread().getName() + ",開始執行.....");
        int i = 0;
        while (flag) {
            i++;
        }
        System.out.println(Thread.currentThread().getName() + ",結束循環");
    }

    public static void main(String[] args) throws InterruptedException {
        VisibilityTest test = new VisibilityTest();

        // 線程threadA模擬數據加載場景
        Thread threadA = new Thread(() -> test.load(), "threadA");
        threadA.start();

        // 讓threadA執行一會兒
        Thread.sleep(1000);
        // 線程threadB 修改 共享變量flag
        Thread threadB = new Thread(() -> test.change(), "threadB");
        threadB.start();

    }
}

threadA 負責循環,threadB負責修改 共享變量flag,如果flag=false時,threadA 會結束循環,但是上面的例子會死循環。原因是threadA無法立即讀取到共享變量flag修改后的值。我們只需 private volatile boolean flag = true;加上volatile關鍵字threadA就可以立即退出循環了。

Java中的volatile關鍵字提供了一個功能,那就是被其修飾的變量在被修改后可以立即同步到主內存,被其修飾的變量在每次是用之前都從主內存刷新。

因此,可以使用volatile來保證多線程操作時變量的可見性。除了volatile,Java中的synchronizedfinal兩個關鍵字 以及各種 Lock也可以實現可見性。

有序性

有序性:即程序執行的順序按照代碼的先后順序執行。

int i = 0;
int j = 0;
i = 10;   //語句1
j = 1;    //語句2

但由于指令重排序問題,代碼的執行順序未必就是編寫代碼時候的順序。語句可能的執行順序如下:

  1. 語句1 語句2
  2. 語句2 語句1

指令重排對于非原子性的操作,在不影響最終結果的情況下,其拆分成的原子操作可能會被重新排列執行順序。 指令重排不會影響單線程的執行結果,但是會影響多線程并發執行的結果正確性 。在Java 中,可以通過volatile關鍵字來禁止指令進行重排序優化,詳情可見:https://mp.weixin.qq.com/s/TyiCfVMeeDwa-2hd9N9XJQ。也可以使用synchronized關鍵字保證同一時刻只允許一條線程訪問程序塊。


參考資料

《java并發編程實戰》

https://www.cnblogs.com/czwbig/p/11127124.html

https://www.cnblogs.com/jelly12345/p/14609657.html

https://www.cnblogs.com/bailiyi/p/11967396.html

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2972

    瀏覽量

    104867
  • 編譯器
    +關注

    關注

    1

    文章

    1636

    瀏覽量

    49174
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12239
收藏 人收藏

    評論

    相關推薦

    Labview 運行時內存增加

    的dll,用庫函數直接調用這個dll后,Labview運行時所占的內存基本上保持在0.9 M左右,不會卡死了。附件里是那個網友上傳的dll,大家可以下載后將.jpg改為.dll
    發表于 05-19 14:38

    C6748內存分配運行時出錯

    因為需要對大量數據進行處理,我設置一個指針,內存分配1000*sizeof(float),運行時出錯,查看其地址為0x00000000(肯定不對),如果減小分配空間,如200*sizeof
    發表于 03-16 10:05

    C語言內存運行時不同變量是怎樣分配的

    C語言內存運行時不同變量是怎樣分配的?怎樣驗證C語言編譯后的內存地址分配是否合理?
    發表于 02-25 06:37

    請問單片機運行時內存是如何分配的?

    請問單片機運行時內存是如何分配的? 是在鏈接腳本中人工定義?還是編譯器根據某種算法自動分配?
    發表于 09-27 08:16

    java線程內存模型

    一、Java內存模型 按照官方的說法:Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的
    發表于 09-27 10:55 ?0次下載
    <b class='flag-5'>java</b>線程<b class='flag-5'>內存</b>模型

    Java內存模型及原理分析

    一、Java內存模型 按照官方的說法:Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的
    發表于 09-28 11:49 ?0次下載
    <b class='flag-5'>Java</b><b class='flag-5'>內存</b>模型及原理分析

    利用StopWatch監控Java代碼運行時間和分析性能

    利用StopWatch監控Java代碼運行時間和分析性能。
    的頭像 發表于 07-21 16:51 ?2889次閱讀

    Java運行時內存區域硬件內存關系1

    在上一篇文章中,我們了解了計算機由于各個硬件的讀取速度之間的巨大差距,和充分利用CPU的性能的手段方法,及其所帶來的一系列問題: 1. 為了充分壓榨CPU的性能, **CPU 會對指令亂序執行或者語言的編譯器會指令重排** ,讓CPU一直工作不停歇,但同時會導致`有序性問題`。
    的頭像 發表于 02-09 14:41 ?392次閱讀

    JVM運行時數據區之堆內存

    說一下 JVM 運行時數據區吧,都有哪些區?分別是干什么的?
    的頭像 發表于 08-19 14:35 ?703次閱讀
    JVM<b class='flag-5'>運行時</b>數據區之堆<b class='flag-5'>內存</b>

    如何查看java程序的內存分布

    要查看Java程序的內存分布,首先需要了解Java程序運行時內存模型。 Java程序的
    的頭像 發表于 11-23 14:47 ?1069次閱讀

    jvm內存模型和內存結構

    內存模型是指Java程序在運行時,JVM對內存空間的組織和管理方式。它包括了線程私有的部分和線程共享的部分。 線程私有部分 線程私有部分主要包含了棧(Stack)和程序計數器(Prog
    的頭像 發表于 12-05 11:08 ?947次閱讀

    jvm運行時內存區域劃分

    內存區域劃分對于了解Java程序的內存使用非常重要,本文將詳細介紹JVM運行時內存
    的頭像 發表于 12-05 14:08 ?547次閱讀

    jvm管理的內存包括哪幾個運行時數據內存

    JVM(Java虛擬機)是Java程序的運行環境,它提供了內存管理機制來管理Java程序所需的運行時
    的頭像 發表于 12-05 14:09 ?580次閱讀

    jvm內存區域中,哪一塊是屬于線程共享

    是如何劃分的。JVM內存區域主要分為以下幾個部分:程序計數器、Java虛擬機棧、本地方法棧、堆、方法區和運行時常量池。其中,程序計數器、Java
    的頭像 發表于 12-05 14:14 ?1402次閱讀

    java虛擬機內存包括遠空間內存

    Java虛擬機(JVM)內存Java程序執行時所使用的內存空間的總稱,包括了Java堆、方法區
    的頭像 發表于 12-05 14:15 ?416次閱讀
    主站蜘蛛池模板: 叮当成人社区| 久久综合色一综合色88| 青青草国产自偷拍| 成年免费大片黄在线观看岛国| 色欲人妻无码AV精品一区二区| 国产午夜一级淫片| 中文字幕在线观看亚洲日韩| 青青视频国产色偷偷| 国产精品一区二区人妻无码| 怡春院院日本一区二区久久| 欧美嫩freexxxhddvd| 国产精品高清m3u8在线播放| 在线 | 果冻国产传媒61国产免费| 女生扒开尿口| 国产呦精品一区二区三区下载| 52色擼99热99| 我和黑帮老大第365天第2季在线 | 国产乱码精品AAAAAAAA| 影音先锋xfplay影院av| 日本少妇内射视频播放舔| 果冻传媒在线观看高清完整免费 | 公粗挺进了我的密道在线播放贝壳| 亚洲日韩国产成网站在线| 青青草在现线免费观看| 精品久久久久中文字幕| xxx性欧美在线观看| 一个人HD高清在线观看免费视频| 日本乱子人伦在线视频| 久久超碰色中文字幕| 多男同时插一个女人8p| 最近的中文字幕2019国语 | 亚洲综合中文| 婷婷色色狠狠爱| 嗯啊好爽视频| 久久久96人妻无码精品蜜桃| 国产1广场舞丰满老女偷| 2022久久精品国产色蜜蜜麻豆| 亚洲国产日韩a精品乱码| 日韩欧美1区| 欧美精品3atv一区二区三区| 久久精品久精品99热|