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

Java并發(fā)編程中的volatile關(guān)鍵字詳解

 更新時間:2023年08月14日 08:29:24   作者:劉婉晴  
這篇文章主要介紹了Java并發(fā)編程中的volatile關(guān)鍵字詳解,volatile?用于保證我們某個變量的可見性,使其一直存放在主存中,不被移動到某個線程的私有工作內(nèi)存中,需要的朋友可以參考下

一、什么是 JMM

JMM 是 Java 內(nèi)存模型的縮寫,其將 Java 運行的底層內(nèi)存模型抽象成了 主存 和 工作內(nèi)存。

其中, 主存就是線程共享的內(nèi)存, 工作內(nèi)存就是線程所私有的內(nèi)存 。

二、什么是可見性

可見性是指放在主存中的內(nèi)容所有線程都是可見的 。

但是由于 JIT (即時編譯器)的存在,有時我們放在主存中內(nèi)容,會被其移動到工作內(nèi)存給某個線程私有 。

三、引出 volitale

1. volatile 用來做什么

volatile 用于保證我們某個變量的可見性,使其一直存放在主存中,不被移動到某個線程的私有工作內(nèi)存中。

synchronized 也能實現(xiàn)可見性,但是麻煩,沒有 volatile 簡潔,而且更加重量級,會降低效率

2. 舉個例子,怎么使用

volatile 可以用來修飾 :

  • 成員變量
  • 靜態(tài)成員變量

使用實例

public class TestVolatile {
     volatile static boolean use = true;
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            while (use){
                // 執(zhí)行相應操作
            }
        });
        thread.start();
        // 主線程休眠一秒
        sleep(1000);
        use = false;
    }
}

3. volatile 可以保證原子性嘛

不能,它只能保證可見性,不能保證原子性 。

四、 volatile 原理 (JDK 1.5 之后)

內(nèi)存屏障技術(shù), Memory Barrier

  • 寫指令,加入寫屏障
  • 讀指令,加入讀屏障

1. 保證可見性

  • 寫屏障保證在該屏障之前,對共享變量的改動,都同步到主存中
  • 讀屏障保證在該屏障之后,對共享變量的讀取,加載的是主存中的最新數(shù)據(jù)

在這里插入圖片描述

2. 保證有序性

  • 寫屏障確保指令重排時,不會將寫屏障之前的代碼排在寫屏障之后
  • 讀屏障確保指令重排時,不能將讀屏障之前的代碼排在讀屏障之后

3. 解決 dcl 問題 (double-checked locking)

public class Singleton {
    private Singleton() {}
    private static Singleton INSTANCE = null;
    public static Singleton getINSTANCE(){
        if(INSTANCE == null){
            synchronized (Singleton.class) {
                if(INSTANCE == null) {
                	// 會因為指令重排序出現(xiàn)問題
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

解決 dcl 問題

為共享變量加上 volatile 關(guān)鍵字,從而避免指令重排序的問題 。 (jvm 可能對指令進行重排序,重排序可以會在多線程并發(fā)時出現(xiàn)問題)

在這里插入圖片描述

到此這篇關(guān)于Java并發(fā)編程中的volatile關(guān)鍵字詳解的文章就介紹到這了,更多相關(guān)Java中的volitale關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot2為接口統(tǒng)一加url前綴的實現(xiàn)示例

    SpringBoot2為接口統(tǒng)一加url前綴的實現(xiàn)示例

    本文主要介紹了SpringBoot2為接口統(tǒng)一加url前綴的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • java實現(xiàn)md5加密示例

    java實現(xiàn)md5加密示例

    這篇文章主要介紹了java實現(xiàn)md5加密示例,需要的朋友可以參考下
    2014-05-05
  • Java中volatile關(guān)鍵字的作用是什么舉例詳解

    Java中volatile關(guān)鍵字的作用是什么舉例詳解

    這篇文章主要介紹了Java中volatile關(guān)鍵字的作用是什么的相關(guān)資料,volatile關(guān)鍵字在Java中用于修飾變量,提供可見性和禁止指令重排的特性,但不保證原子性,它通過內(nèi)存屏障實現(xiàn)這些特性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • 作為程序員必須掌握的Java虛擬機中的22個重難點(推薦0

    作為程序員必須掌握的Java虛擬機中的22個重難點(推薦0

    這篇文章主要介紹了Java虛擬機中22個重難點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • java實現(xiàn)讀取txt文件中的內(nèi)容

    java實現(xiàn)讀取txt文件中的內(nèi)容

    本文通過一個具體的例子向大家展示了如何使用java實現(xiàn)讀取TXT文件里的內(nèi)容的方法以及思路,有需要的小伙伴可以參考下
    2016-03-03
  • Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查

    Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查

    這篇文章主要介紹了Spring boot2+jpa+thymeleaf實現(xiàn)增刪改查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java調(diào)用瀏覽器打開網(wǎng)頁完整實例

    Java調(diào)用瀏覽器打開網(wǎng)頁完整實例

    這篇文章主要介紹了Java調(diào)用瀏覽器打開網(wǎng)頁的方法,以完整實例形式分析了java打開網(wǎng)頁的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Redisson分布式鎖的原理和代碼實例

    Redisson分布式鎖的原理和代碼實例

    這篇文章主要介紹了Redisson分布式鎖的原理和代碼實例,在分布式系統(tǒng)中,鎖機制是非常重要的,Redisson是一個基于Redis的Java應用程序,常常被應用作為分布式鎖的解決方案,需要的朋友可以參考下
    2024-01-01
  • Maven的使用之繼承與聚合

    Maven的使用之繼承與聚合

    這篇文章主要為大家詳細介紹了Maven的繼承和聚合,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2023-04-04
  • 詳解spring中使用Elasticsearch的代碼實現(xiàn)

    詳解spring中使用Elasticsearch的代碼實現(xiàn)

    本篇文章主要介紹了詳解spring中使用Elasticsearch的代碼實現(xiàn),具有一定的參考價值,有興趣的可以了解一下
    2017-05-05

最新評論

鄂尔多斯市| 乐昌市| 合川市| 黑山县| 清河县| 虹口区| 维西| 报价| 揭阳市| 喀喇| 张家港市| 离岛区| 大田县| 宜丰县| 锡林浩特市| 琼结县| 出国| 阿坝| 平山县| 偏关县| 扎赉特旗| 信阳市| 白城市| 玛曲县| 榆中县| 娱乐| 扶绥县| 耒阳市| 巴东县| 海盐县| 泽库县| 巢湖市| 九台市| 外汇| 建阳市| 晋城| 筠连县| 蒙阴县| 松桃| 德化县| 西充县|