Java中的volatile關鍵字詳解

核心作用:解決可見性和有序性問題

volatile?的主要作用可以歸結為兩點:

? ? ? ? ? ? ? ? 1.保證變量的可見性?和?禁止指令重排序

? ? ? ? ? ? ? ? 2.它提供了一種輕量級的同步機制,

? ? ? ? ? ? ? ? 3.但需要注意的是,它不能保證原子性

保證可見性:

  • 什么是可見性問題?

? ? ? ? 1.在 Java 內存模型中,每個線程都有自己的工作內存。

? ? ? ? 2.線程操作變量時,通常會先從主內存拷貝一份到自己的工作內存,

? ? ? ? ? ?操作完成后再刷回主內存。

問題在于:一個線程修改了自己工作內存中的變量副本,在沒有同步機制的情況下,其他線程可能無法立即看到這個修改,讀到的仍然是舊值。

  • volatile?如何解決?

????????????????寫操作:當寫一個?volatile?變量時,

????????????????????????? ? ??JVM 會立即將該線程工作內存中的新值強制刷新到主內存中。

????????????????讀操作:當讀一個?volatile?變量時,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? JVM 會使該線程工作內存中的緩存失效,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 從而強制它從主內存中重新讀取最新的值。

這樣就保證了,一旦某個線程修改了?volatile?變量,這個新值對其他所有線程來說都是立即可見的。它解決了線程間的可見性問題。

禁止指令重排序?

  • 什么是指令重排序問題?

? ? ? ? ? ? ? ? 1.為了優化性能,編譯器和處理器常常會對指令的執行順序進行重排序(在不改變單線

? ? ? ? ? ? ? ? ? ?程程序語義的前提下)。

????????????????2.在單線程下沒問題,但在多線程環境下,這種亂序執行可能導致意想不到的錯誤。

  • volatile?如何解決?

????????????????過添加內存屏障(Memory Barrier)來實現。? ?

? ??????????????在寫?volatile?變量時,會在寫操作后插入一個“寫屏障”,

? ? ? ? ? ? ? ? 確保該變量之前的所有操作都已經完成,并且結果對其他線程可見。

????????????????這些屏障阻止了編譯器和水線將?volatile?變量的操作與其他內存操作進行重排序,

????????????????從而保證了有序性。

    ?不能保證原子性?

    這是一個非常關鍵的限制,也是?volatile?最常見的誤用點

    • 什么是原子性?

    ????????原子性意味著一個操作是不可中斷的,

    ????????要么完全執行成功,要么完全不執行。

    ????????例如?i++?這個操作,它實際上包含三個步驟:

    ????????????????讀取?i?的值

    ????????????????將?i?的值加 1

    ????????????????將新值寫回?i
    這是一個復合操作,而不是原子操作。

    • 為什么?volatile?不行?

    假設兩個線程同時執行?volatileInt++volatileInt?是?volatile?變量):

    1. 線程 A 讀取?volatileInt?的值為 10。

    2. 線程 B?讀取?volatileInt?的值為 10(因為線程 A 還沒寫回,可見性保證了讀到的都是最新值,但讀取后它們就各自操作了)。

    3. 線程 A 對 10 加 1 得到 11,并立即寫回主內存(由于是?volatile,寫成功)。

    4. 線程 B 也對 10 加 1 得到 11,并寫回主內存(覆蓋了線程 A 的結果)。
      最終結果不是預期的 12,而是 11。

    可見性保證了它們讀到的都是最新的,但無法阻止它們在“讀取-修改-寫回”這個過程中被中斷。要解決這個問題,必須使用鎖(synchronized)或原子類(如?AtomicInteger)。

      本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
      如若轉載,請注明出處:http://www.pswp.cn/pingmian/95923.shtml
      繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95923.shtml
      英文地址,請注明出處:http://en.pswp.cn/pingmian/95923.shtml

      如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

      相關文章

      【Linux】MySQL數據目錄遷移步驟(含流程圖踩坑經驗)

      在生產環境中,有時候你會遇到一些看似簡單但實際上很棘手的問題。最近我就碰到了一次典型的服務器磁盤空間告急,最后通過遷移 MySQL 數據目錄成功解決了問題。本文記錄整個過程,包括我的分析思路、遷移步驟、踩坑和經驗總結,希望對…

      數據驅動下的連鎖模式復制:技術科普與方法論深度解析

      前言在連鎖經營的賽道上,“復制”是核心命題,但絕非簡單的“粘貼”。當行業進入數字化深水區,數據驅動正成為連鎖模式突破增長瓶頸、實現高效復制的“隱形引擎”。本文將從技術科普與方法論心得兩個維度,深度拆解數據如何重塑連鎖…

      數據庫學習MySQL系列2、Windows11系統安裝MySQL方法一.msi安裝詳細教程

      方法一.msi安裝詳細教程 Windows系統下MySQL——.msi安裝詳細教程(默認--只安裝服務端“Server only”)MySql官網地址:https://www.mysql.com/;快速下載通道請單擊→ No thanks, just start my download.ps:其他資源(…

      html+css+vue實現增刪改查

      代碼如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>優化版 Vue.js CRUD 示例&l…

      (計算機網絡)DNS解析流程及兩種途徑

      在計算機網絡中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 將域名解析為 IP 地址。一個完整的解析過程涉及 遞歸查詢、迭代查詢&#xff0c;以及多個關鍵角色&#xff08;LDNS、本地域名服務器&#xff1b;根服務器&#xff1b;頂級域名服務器&#xff1b…

      數據結構——隊列(Java)

      一.基本概念 隊列用來存儲邏輯關系為“一對一”的數據&#xff0c;是一種“特殊”的線性存儲結構。 特點&#xff1a; ?先進先出&#xff1a;隊列中元素的添加&#xff08;入隊enqueue&#xff09;和移除&#xff08;出隊dequeue&#xff09;遵循先進先出的原 則。 ?端點&…

      【Go】:mac 環境下GoFrame安裝開發工具 gf-cli——gf_darwin_arm64

      當前主要是關于gf_darwin_arm64的安裝步驟 如何快速給mac電腦安裝gfgf是什么安裝步驟方法1&#xff1a;去github下載gf-cli去git上下載對應電腦版本的gf-cli驗證下載文件是否二進制文件授予該文件權限方法2&#xff1a;去goframe官網教你下載步驟驗證gf是否安裝成功可能遇到的問…

      【新】ApiHug官方文檔-ApiHug Spring Security 擴展-補充說明

      概述 在上次說明中我們寫了ApiHug 如何做授權的&#xff0c; 這里有個概念的混淆&#xff0c; 其實 apihug 不是在spring security 上做的安全擴展&#xff0c; 應該是 apihug spring, 安全設計框架&#xff0c; 和本身 spring security 沒有半毛錢關系&#xff0c; 而如果你…

      【Flask】測試平臺開發,新增說明書編寫和展示功能 第二十三篇

      概述&#xff1a;本篇是接著上一篇&#xff0c;細分出說明書的編寫部分&#xff0c;實現這個功能的需求&#xff0c;是內部很多同事反饋&#xff0c;需要有個地方存工具&#xff0c;并且可以寫說明書&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下載工具和查看工…

      Mac設置中的安全性缺少“任何來源”

      問題&#xff1a;用Mac安裝軟件&#xff0c;隱私性與安全性&#xff0c;想切換“任何來源”用來下載網站的app&#xff0c;但是菜單欄找不到“任何來源”選項&#xff0c;無法安裝dmg的文件終端中一行代碼設置出來&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

      uniapp開發小程序,列表 點擊后加載更多數據

      一、需求 1.初始顯示限制:將每頁條數limit改為5,確保初始只顯示5條數據 2.查看更多功能:添加了loadMore方法,點擊"查看更多"時加載下一頁數據 3.實現查看更多功能,點擊后加載更多數據 4.添加loading狀態防止重復請求 添加hasMore狀態判斷是否還有更多數據 …

      Windows 部署 Gerrit 與 Apache24 配置

      Windows 部署 Gerrit 與 Apache24 并配置反向代理 準備工作 下載并安裝 Java JDK 確保配置 JAVA_HOME 環境變量博主這里安裝openjdk21 https://jdk.java.net/archive/下載所需軟件 Apache24&#xff1a;https://httpd.apache.org/download.cgi Gerrit&#xff1a;https://www.g…

      從 Excel 趨勢線到機器學習:拆解 AI 背后的核心框架?

      引言&#xff1a;你其實早就 “玩轉” 過機器學習&#xff1f;提到 “機器學習”&#xff0c;你是不是第一時間聯想到復雜的代碼、密密麻麻的公式&#xff0c;還有那些讓人頭暈的 “算法”“模型”“訓練” 術語&#xff1f;仿佛它是高高在上的技術&#xff0c;離我們的日常無比…

      Lenovo聯想YOGA Pro 16 IAH10 2025款筆記本電腦(83L0)開箱狀態預裝OEM原廠Win11系統

      適用機型(MTM)&#xff1a;【83L0】 鏈接&#xff1a;https://pan.baidu.com/s/1tDpeBb93t1u0XIgqAZ3edg?pwdqy2r 提取碼&#xff1a;qy2r 聯想原裝系統自帶所有驅動、出廠主題壁紙、系統屬性聯機支持標志、系統屬性專屬LOGO標志、Office辦公軟件、聯想瀏覽器、電腦管家、…

      Android 開發 - 一些畫板第三方庫(DrawBoard、FingerPaintView、PaletteLib)

      一、DrawBoard 1、Dependencies 模塊級 build.gradle implementation com.github.jenly1314:drawboard:1.1.02、Test &#xff08;1&#xff09;Activity Layout activity_draw_board.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

      捷多邦揭秘超厚銅板:從制造工藝到設計關鍵環節?

      一、超厚銅板制造工藝要點超厚銅板&#xff08;3oz 及以上&#xff09;的制造工藝對精度和穩定性要求嚴苛&#xff0c;核心環節需突破多重技術壁壘。蝕刻工藝中&#xff0c;因銅箔厚度達 105μm 以上&#xff0c;需采用高濃度酸性蝕刻液&#xff08;氯化銅濃度控制在 180-220g/…

      【MYSQL | 高級篇 MyCat實現分庫分表】

      摘要&#xff1a;本文圍繞分庫分表展開&#xff0c;先分析單庫性能瓶頸&#xff0c;介紹垂直與水平拆分策略及實現技術&#xff0c;再詳述 MyCat 中間件的概述、環境準備、目錄結構&#xff0c;講解其入門配置與測試&#xff0c;深入說明核心配置文件&#xff0c;最后演示垂直和…

      Docker部署Drawnix開源白板工具

      Drawnix簡介 Drawnix 是一款開源的在線白板工具&#xff08;SaaS&#xff09;&#xff0c;集思維導圖、流程圖繪制、自由畫圖等多種功能于一體&#xff0c;支持協作與插件擴展&#xff0c;適用于個人創作、團隊協作和遠程辦公場景。它完全免費且開源&#xff0c;提供豐富的編輯…

      Griffin|增強現實數據集|無人機數據集

      Griffin|增強現實數據集|無人機數據集 數據來源&#xff1a;huggingface 百度網盤 構建方式 Griffin數據集的構建采用了模塊化架構&#xff0c;結合了CARLA和AirSim平臺&#xff0c;通過模擬真實世界中的無人駕駛環境和無人機動態&#xff0c;收集了超過30,000幀圖像數據&am…

      力扣.1054距離相等的條形碼力扣767.重構字符串力扣47.全排列II力扣980.不同路徑III力扣509.斐波那契數列(記憶化搜索)

      目錄 力扣.1054距離相等的條形碼 力扣767.重構字符串 力扣47.全排列II 力扣980.不同路徑III 力扣509.斐波那契數列&#xff08;記憶化搜索) 力扣.1054距離相等的條形碼 是否策略正確 但是假如 1 2 2 此時 1_2 此時中間只能填寫2&#xff0c;但是就不對了&#xff0c;所…