Java 中的 volatile 是什么?


👉 volatile :不穩定的

英[?v?l?ta?l] 美[?vɑ?l?tl]

  • adj.
    不穩定的;<計>易失的;易揮發的,易發散的;爆發性的,爆炸性的;易變的,無定性的,無常性的;短暫的,片刻的;活潑的,輕快的,無憂慮的;暴躁的;易引起的;易惡化的;可能急劇波動的;<古>迅速游移的;
  • n.
    <罕>有翅動物;易揮發物;

🚀 簡介

volatile 是 Java 中的一個輕量級同步機制,主要用于線程之間的變量可見性禁止指令重排序。它不是用來代替 synchronized 的,而是適用于特定場景下的輕量并發控制。

? 一、volatile 的兩個核心作用

功能說明
1. 可見性一個線程對變量的修改,其他線程能夠立即看到。
2. 禁止指令重排序保證寫操作的順序不會被 JVM 或 CPU 優化打亂(有利于實現安全發布)。

🔍 二、典型使用場景

1. 狀態標志變量(最典型)

場景: 控制線程的啟動/關閉狀態,線程輪詢判斷某個狀態是否更新。

class Worker extends Thread {private volatile boolean running = true;public void run() {while (running) {// do something}}public void shutdown() {running = false;}
}

? 使用 volatile,可確保 shutdown() 方法修改的 running 變量,對 run() 方法中立即可見。

2. 雙重檢查鎖(DCL,單例模式)

場景: 延遲初始化(懶漢式單例)時,避免指令重排帶來的空指針問題。

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {                     // 第一次檢查synchronized (Singleton.class) {if (instance == null) {             // 第二次檢查instance = new Singleton();     // 可能指令重排序 → 需要 volatile}}}return instance;}
}

? volatile 防止 new Singleton() 的指令重排。

3. 輕量級發布-訂閱模型

比如:多線程間通信或事件通知機制,不需要完整同步,僅靠可見性傳播狀態。

class FlagManager {public volatile boolean updated = false;
}

線程 A 修改 updated = true,線程 B 輪詢即可及時感知變化。

4. 避免無效同步開銷

當你只是想讓一個變量對所有線程可見,又不希望使用 synchronized 帶來的上下文切換成本時,用 volatile 是性能更優的選擇。

🚫 三、不適合 volatile 的場景(易錯)

自增操作(++)不是原子操作,不適合 volatile

volatile int count = 0;public void add() {count++; // 非線程安全,count++ 實際包含:讀 → 改 → 寫
}

? 正確做法:使用 AtomicInteger 或 synchronized

🔁 四、volatile 和 synchronized 區別

特性volatilesynchronized
可見性? 有? 有
原子性? 沒有? 有
是否阻塞? 非阻塞? 阻塞(互斥鎖)
應用場景狀態標識、單例等臨界區保護、讀寫操作

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

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

相關文章

MongoDB性能優化實戰指南:原理、實踐與案例

MongoDB性能優化實戰指南&#xff1a;原理、實踐與案例 在大規模數據存儲與查詢場景下&#xff0c;MongoDB憑借其靈活的文檔模型和水平擴展能力&#xff0c;成為眾多互聯網及企業級應用的首選。然而&#xff0c;在生產環境中&#xff0c;隨著數據量和并發的增長&#xff0c;如何…

細談kotlin中綴表達式

Kotlin 是一種適應你編程風格的語言&#xff0c;允許你在想什么時候寫代碼就什么時候寫代碼。Kotlin 提供了一些機制&#xff0c;幫助我們編寫易讀易懂的代碼。其中一個非常有趣的機制是 中綴表達式&#xff08;infix notation&#xff09;。它允許我們定義和調用函數時省略點號…

[Nagios Core] CGI接口 | 狀態數據管理.dat | 性能優化

鏈接&#xff1a;https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/ docs&#xff1a;Nagios Core Nagios Core 是功能強大的基礎設施監控系統&#xff0c;包含 CGI 程序&#xff0c;允許用戶通過 Web 界面查看當前狀態、歷史記錄等。通過以下技術棧實現…

Linux進程優先級機制深度解析:從Nice值到實時調度

前言 在Linux系統中&#xff0c;進程優先級決定了CPU資源的分配順序&#xff0c;直接影響系統性能和關鍵任務的響應速度。無論是優化服務器負載、確保實時任務穩定運行&#xff0c;還是避免低優先級進程拖慢系統&#xff0c;合理調整進程優先級都是系統管理和性能調優的重要技能…

深入淺出Kafka Broker源碼解析(下篇):副本機制與控制器

一、副本機制深度解析 1.1 ISR機制實現 1.1.1 ISR管理核心邏輯 ISR&#xff08;In-Sync Replicas&#xff09;是Kafka保證數據一致性的核心機制&#xff0c;其實現主要分布在ReplicaManager和Partition類中&#xff1a; public class ReplicaManager {// ISR變更集合&#xff0…

Fluent許可文件安裝和配置

在使用Fluent軟件進行流體動力學模擬之前&#xff0c;正確安裝和配置Fluent許可文件是至關重要的一步。本文將為您提供詳細的Fluent許可文件安裝和配置指南&#xff0c;幫助您輕松完成許可文件的安裝和配置&#xff0c;確保Fluent軟件能夠順利運行。 一、Fluent許可文件安裝步驟…

Python----大模型( RAG的文本分割,文本分割方法 )

一、RAG文本分割RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09;模型是一種結合了檢索 和生成能力的自然語言處理模型。 它通過檢索相關的文檔片段&#xff0c;并將這些信息作為生成過程的上下文&#xff0c;以提高生成質量 和準確性。在R…

vue筆記3 VueRouter VueX詳細講解

vueRouter & vueX 看到這里的朋友如果沒有看過前幾期&#xff0c;可以通過文章的鏈接跳轉到第一期&#xff0c;從第一期的 vue2 語法開始學習&#xff0c;如果是復習的朋友&#xff0c;也可以看本期只學習 vueRouter & VueX 項目初始化 經過上期&#xff0c;我們學習…

從當下需求聊聊Apifox 與 Apipost 的差異

作為一名長期投身于復雜項目開發的工程師&#xff0c;我深切體會到一款適配的接口管理工具對提升開發效率的關鍵意義。當團隊在進行工具選型時&#xff0c;我對 Apifox 和 Apipost 展開了全面且系統的對比分析&#xff0c;其中的諸多發現&#xff0c;值得與大家深入探討。 一、…

藍牙協議棧高危漏洞曝光,攻擊可入侵奔馳、大眾和斯柯達車載娛樂系統

OpenSynergy BlueSDK關鍵漏洞&#xff0c;可遠程執行代碼入侵數百萬車輛系統PCA網絡安全公司的研究人員在OpenSynergy BlueSDK藍牙協議棧中發現了一組被統稱為"完美藍"&#xff08;PerfektBlue&#xff09;的關鍵漏洞。利用這些漏洞可能對數百萬輛汽車實施遠程代碼執…

Android 性能優化:啟動優化全解析

前言 Android應用的啟動性能是用戶體驗的重要組成部分。一個啟動緩慢的應用不僅會讓用戶感到煩躁&#xff0c;還可能導致用戶放棄使用。 本文將深入探討Android應用啟動優化的各個方面&#xff0c;包括啟動流程分析、優化方法、高級技巧和具體實現。 一、Android應用啟動流程深…

前沿重器[69] | 源碼拆解:deepSearcher動態子查詢+循環搜索優化RAG流程

前沿重器欄目主要給大家分享各種大廠、頂會的論文和分享&#xff0c;從中抽取關鍵精華的部分和大家分享&#xff0c;和大家一起把握前沿技術。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。&#xff08;算起來&#xff0c;專項啟動已經…

Vue+axios

1. axios簡介axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;主要用于瀏覽器和 Node.js 環境中發送 HTTP 請求。它是目前前端開發中最流行的網絡請求庫之一&#xff0c;被廣泛應用于各種 JavaScript 項目&#xff08;如 React、Vue、Angular 等框架或原生 JS 項目&#x…

通過Tcl腳本命令:set_param labtools.auto_update_hardware 0

1.通過Tcl腳本命令&#xff1a;set_param labtools.auto_update_hardware 0 禁用JTAG上電檢測&#xff0c;因為2016.1 及更高版本 Vivado 硬件管理器中&#xff0c;當 FPGA正連接編程電纜時 重新上電&#xff0c;可能會出現FPGA無法自動加載程序的故障。 2.還可以通過 hw_serv…

Spring Boot 安全登錄系統:前后端分離實現

關鍵詞&#xff1a;Spring Boot、安全登錄、JWT、Shiro / Spring Security、前后端分離、Vue、MySQL 詳細代碼請參考這篇文章&#xff1a;完整 Spring Boot Vue 登錄 ? 摘要 在現代 Web 應用中&#xff0c;用戶登錄與權限控制是系統安全性的基礎環節。本文將手把手帶你實現…

Docker高級管理--Dockerfile 鏡像制作

目錄 一&#xff1a;Docker 鏡像管理 1:Docker 鏡像結構 &#xff08;1&#xff09; 鏡像分層核心概念 &#xff08;2&#xff09;鏡像層特性 &#xff08;3&#xff09;關鍵操作命令 &#xff08;4&#xff09;優化建議 2&#xff1a;Dockerfile介紹 &#xff08;1&…

Leetcode力扣解題記錄--第42題 接雨水(動規和分治法)

題目鏈接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 這里我們可以用兩種方法去解決巧妙地解決這個題。首先來看一下題目 題目描述 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。…

寶塔配置pgsql可以遠程訪問

本地navicat premium 17.0 可以遠程訪問pgsql v16.1寶塔的軟件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客戶端認證&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses關鍵字&#xff1b;第三步&#xff1a;在navicat里配…

小架構step系列12:單元測試

1 概述 測試的種類很多&#xff1a;單元測試、集成測試、系統測試等&#xff0c;程序員寫代碼進行測試的可以稱為白盒測試&#xff0c;單元測試和集成測試都可以進行白盒測試&#xff0c;可以理解為單元測試是對某個類的某個方法進行測試&#xff0c;集成測試則是測試一連串的…

SpringBoot3-Flowable7初體驗

目錄簡介準備JDKMySQLflowable-ui創建流程圖要注意的地方編碼依賴和配置控制器實體Flowable任務處理類驗證啟動程序調用接口本文源碼參考簡介 Flowable是一個輕量的Java業務流程引擎&#xff0c;用于實現業務流程的管理和自動化。相較于老牌的Activiti做了一些改進和擴展&…