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

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

 更新時間:2025年04月22日 08:38:53   作者:+720  
這篇文章主要介紹了Java中volatile關(guān)鍵字的作用是什么的相關(guān)資料,volatile關(guān)鍵字在Java中用于修飾變量,提供可見性和禁止指令重排的特性,但不保證原子性,它通過內(nèi)存屏障實現(xiàn)這些特性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

volatile 是 Java 中的一個關(guān)鍵字,用于修飾變量。它提供了 可見性 和 禁止指令重排 的特性,但不保證 原子性。

1. 可見性 (Visibility)

  • 問題背景: 在多線程環(huán)境下,每個線程都有自己的工作內(nèi)存(例如 CPU 緩存),線程對共享變量的讀寫操作可能不是直接在主內(nèi)存中進(jìn)行的,而是在工作內(nèi)存中進(jìn)行的。這可能導(dǎo)致一個線程修改了共享變量的值,而其他線程卻看不到這個修改,從而讀取到過期的值。
  • volatile 的作用: 當(dāng)一個變量被 volatile 修飾時,它會保證:
    • 寫操作: 當(dāng)一個線程修改了 volatile 變量的值,這個新值會立即被 刷新 到主內(nèi)存中。
    • 讀操作: 當(dāng)一個線程讀取 volatile 變量時,它會從主內(nèi)存中讀取最新的值,而不是從自己的工作內(nèi)存中讀取。
  • 實現(xiàn)原理: volatile 通過 內(nèi)存屏障 (Memory Barrier) 來實現(xiàn)可見性。內(nèi)存屏障是一種 CPU 指令,它可以阻止編譯器和 CPU 對指令進(jìn)行重排序,并強(qiáng)制將工作內(nèi)存中的數(shù)據(jù)刷新到主內(nèi)存,或從主內(nèi)存讀取數(shù)據(jù)。

代碼示例:

public class VolatileVisibilityExample {
    private static volatile boolean flag = false;
 // private static boolean flag = false; 如果不使用volatile,可能出現(xiàn)線程1無法停止的情況

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            while (!flag) {
                // ... (循環(huán)執(zhí)行某些操作) ...
            }
            System.out.println("Thread 1 stopped.");
        });

        Thread thread2 = new Thread(() -> {
            try {
                Thread.sleep(1000); // 讓 thread1 先執(zhí)行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag = true; // 修改 flag 的值
            System.out.println("Thread 2 set flag to true.");
        });

        thread1.start();
        thread2.start();
    }
}

2. 禁止指令重排 (Ordering)

  • 問題背景: 為了優(yōu)化性能,編譯器和 CPU 可能會對指令的執(zhí)行順序進(jìn)行重排序(reordering),只要不影響單線程程序的執(zhí)行結(jié)果。但在多線程環(huán)境下,指令重排可能導(dǎo)致程序出現(xiàn)意外的行為。
  • volatile 的作用: volatile 關(guān)鍵字可以禁止特定類型的指令重排:
    • 寫后讀: 不能將 volatile 變量的寫操作重排到讀操作之后。
    • 寫后寫: 不能將 volatile 變量的寫操作重排到另一個 volatile 變量的寫操作之后。
    • 讀后讀/寫: 不能將volatile變量的讀操作重排到另一個volatile變量的讀操作或?qū)懖僮髦蟆?/li>
  • 實現(xiàn)原理: volatile 通過插入特定類型的內(nèi)存屏障來禁止指令重排。例如,在 volatile 變量的寫操作之后會插入一個 StoreStore 屏障,在讀操作之前會插入一個 LoadLoad 屏障,以及可能的StoreLoad屏障。
  • 雙重檢查鎖定 (Double-Checked Locking) 的例子: volatile 經(jīng)常用于雙重檢查鎖定模式,以防止指令重排導(dǎo)致的問題。
    //單例模式
    public class Singleton{
        //使用volatile禁止instance = new Singleton()的指令重排
        private static volatile Singleton instance;
    
        private Singleton(){}
    
        public static Singleton getInstance(){
            if(instance == null){ //第一次檢查
                synchronized(Singleton.class){
                    if(instance == null){ //第二次檢查,防止多個線程同時通過第一次檢查
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    

3. 不保證原子性 (Atomicity)

  • 重要說明: volatile 不保證 操作的原子性。原子性指的是一個操作是不可分割的,要么全部執(zhí)行,要么不執(zhí)行,不會出現(xiàn)執(zhí)行一半的情況。
  • 例子: volatile 變量的自增操作 (i++) 不是原子性的。它實際上包含了三個步驟:讀取 i 的值、將 i 的值加 1、將新值寫回 i。在多線程環(huán)境下,這三個步驟之間可能會被其他線程打斷,導(dǎo)致結(jié)果錯誤。
  • **解決:**如果需要保證原子性,可以使用 synchronizedReentrantLock 或原子類(如 AtomicInteger)。

總結(jié):

  • volatile 關(guān)鍵字用于修飾變量,提供可見性和禁止指令重排的特性。
  • 可見性保證線程對 volatile 變量的讀寫操作都是直接在主內(nèi)存中進(jìn)行的。
  • 禁止指令重排防止編譯器和 CPU 對 volatile 變量相關(guān)的指令進(jìn)行重排序。
  • volatile 不保證 原子性。
  • volatile 通常用于狀態(tài)標(biāo)志、雙重檢查鎖定等場景。

問題分析:

這個問題考察了對 volatile 關(guān)鍵字的理解,包括它的作用、特性(可見性、禁止指令重排)以及局限性(不保證原子性)。回答時需要清晰地解釋這些概念,并提供一些代碼示例來說明問題。

與其他問題的知識點聯(lián)系:

  • 什么是 Java 內(nèi)存模型(JMM)? volatile 是 Java 內(nèi)存模型 (JMM) 的一部分,它定義了線程和主內(nèi)存之間的交互規(guī)則。
  • 什么是 Java 中的原子性、可見性和有序性? volatile 提供了可見性和有序性(禁止指令重排),但不保證原子性。
  • 什么是 Java 的 happens-before 規(guī)則? volatile 變量的寫操作 happens-before 于后續(xù)對該變量的讀操作。
  • 什么是 Java 中的指令重排? volatile 可以禁止特定類型的指令重排。
  • Java 中的 synchronized 是怎么實現(xiàn)的? synchronized 提供了原子性、可見性和有序性。在某些情況下,volatile 可以作為 synchronized 的一種輕量級替代方案(如果只需要保證可見性和有序性)。
  • 你使用過 Java 中的哪些原子類? 原子類(如 AtomicInteger)提供了原子操作,可以用來替代 volatile + 額外同步的方案。
  • Java 中的 final 關(guān)鍵字是否能保證變量的可見性? final關(guān)鍵字可以保證可見性。

理解這些聯(lián)系可以幫助你更全面地掌握 Java 并發(fā)編程的知識,并了解如何在實際應(yīng)用中選擇合適的同步機(jī)制。

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

相關(guān)文章

  • java中利用反射調(diào)用另一類的private方法的簡單實例

    java中利用反射調(diào)用另一類的private方法的簡單實例

    下面小編就為大家?guī)硪黄猨ava中利用反射調(diào)用另一類的private方法的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 出現(xiàn)java.lang.NoSuchMethodException異常的解決(靠譜)

    出現(xiàn)java.lang.NoSuchMethodException異常的解決(靠譜)

    這篇文章主要介紹了出現(xiàn)java.lang.NoSuchMethodException異常的解決方案(靠譜),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn)

    java 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn)

    本文主要介紹了java 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Java8 Comparator排序方法實例詳解

    Java8 Comparator排序方法實例詳解

    這篇文章主要介紹了Java8 Comparator排序方法實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Spring Boot2解決idea console 控制臺輸出亂碼的問題

    Spring Boot2解決idea console 控制臺輸出亂碼的問題

    這篇文章主要介紹了Spring Boot2解決idea console 控制臺輸出亂碼的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • spring?webflux響應(yīng)式編程使用詳解

    spring?webflux響應(yīng)式編程使用詳解

    webflux,即響應(yīng)式編程,響應(yīng)式編程是一種用于處理異步數(shù)據(jù)流和事件的編程范式,spring?webflux是spring在5.0版本后提供的一套響應(yīng)式編程風(fēng)格的web開發(fā)框架,本文給大家詳細(xì)講講spring?webflux響應(yīng)式編程的使用,需要的朋友可以參考下
    2023-10-10
  • java中hashCode方法與equals方法的用法總結(jié)

    java中hashCode方法與equals方法的用法總結(jié)

    總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合內(nèi)的元素是有序的,元素可以重復(fù);后者元素?zé)o序,但元素不可重復(fù)
    2013-10-10
  • 如何使用java修改文件所有者及其權(quán)限

    如何使用java修改文件所有者及其權(quán)限

    這篇文章主要介紹了如何使用java修改文件所有者及其權(quán)限,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java中的二維數(shù)組的賦值與輸出方式

    Java中的二維數(shù)組的賦值與輸出方式

    這篇文章主要介紹了Java中的二維數(shù)組的賦值與輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 關(guān)于spring循環(huán)依賴問題及解決方案

    關(guān)于spring循環(huán)依賴問題及解決方案

    這篇文章主要介紹了關(guān)于spring循環(huán)依賴問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

泉州市| 清徐县| 荣成市| 龙江县| 博罗县| 建水县| 垫江县| 建水县| 怀安县| 满城县| 津市市| 巩留县| 炎陵县| 同仁县| 晋宁县| 京山县| 安阳市| 乡宁县| 武平县| 清水县| 桃园县| 葫芦岛市| 龙门县| 康定县| 贡觉县| 扎赉特旗| 梅河口市| 松阳县| 汪清县| 阿瓦提县| 白朗县| 余干县| 江源县| 榕江县| 沙洋县| 祁连县| 雷波县| 章丘市| 华坪县| 宁河县| 宜州市|