AtomicInteger 和 volatile Integer對比

AtomicIntegervolatile Integer 雖然都與線程安全有關,但本質完全不同。它們的主要區別體現在原子性保證和功能上:


🔍 核心區別對比表

特性volatile IntegerAtomicInteger
原子性? 不保證復合操作原子性? 保證所有操作的原子性
自增操作安全性? i++ 不安全? incrementAndGet() 安全
CAS 操作? 不支持? 原生支持 compareAndSet()
函數式更新? 不支持? 支持 updateAndGet()
性能表現簡單讀寫快復合操作遠優于鎖同步
內部原理內存屏障 + 禁止重排序volatile + CAS 自旋

?? volatile Integer 的問題演示

public class VolatileCounter {private volatile Integer count = 0;// 線程不安全的操作!public void increment() {count++; // 實際分為三步: 讀 -> 改 -> 寫}public int getCount() {return count;}
}

問題代碼解釋

  1. 當線程A讀取 count=0
  2. 線程B同時讀取 count=0
  3. 線程A計算 0+1=1 寫入
  4. 線程B計算 0+1=1 寫入
  5. 結果:實際執行了兩次自增,值卻只變為1

? AtomicInteger 解決方案

import java.util.concurrent.atomic.AtomicInteger;public class SafeCounter {private final AtomicInteger count = new AtomicInteger(0);// 線程安全操作public void safeIncrement() {count.incrementAndGet(); // 原子操作}public int getCount() {return count.get();}
}

關鍵原理

// AtomicInteger 內部實現原理
public final int incrementAndGet() {return U.getAndAddInt(this, VALUE, 1) + 1;
}// 實際執行(Unsafe類):
public final int getAndAddInt(Object o, long offset, int delta) {int v;do {v = getIntVolatile(o, offset);  // 1. 讀取volatile值} while (!weakCompareAndSetInt(v, v + delta)); // 2. CAS自旋return v;
}

📌 本質區別總結

  1. volatile 的作用

    • 只保證可見性有序性
    • 寫操作立即刷新到主存
    • 讀操作總是獲取最新值
  2. AtomicInteger 的優勢

    • 通過 volatile 變量 + CAS 自旋實現復合操作原子性
    • 內置支持數學運算、比較交換等功能
    • 封裝了線程安全的無鎖算法
  3. 性能對比場景

    // 測試代碼片段
    for(int i=0; i<1000000; i++) {// volatile版:1000ms+ // AtomicInteger版:200ms
    }
    

🔄 關系示意圖

volatile int value (基本保障)│▼+-----------------+| AtomicInteger    |→ CAS保證復合操作原子性|   (封裝增強)     |→ 提供原子操作方法族+-----------------+

可見 AtomicInteger 內部使用 volatile 保證可見性(通過 private volatile int value 字段),但增加了 CAS 機制來實現更復雜的原子操作,這是單純 volatile 做不到的。


💡 使用建議

  • 需要單一基本類型的原子操作 → 用 AtomicInteger/Long/Boolean
  • 需要簡單可見性保證 → 用 volatile
  • 需要對象引用的原子更新 → 用 AtomicReference
  • JDK8+高并發計數場景 → 用 LongAdder

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

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

相關文章

一生一芯 PA2 RTFSC

從src/isa/riscv32/inst.c出發。 向上搜索&#xff0c;理解宏定義的含義。 R(i) #define R(i) gpr(i) R(i)&#xff1a;訪問第i號通用寄存器 會被替換為&#xff1a; #define gpr(idx) (cpu.gpr[check_reg_idx(idx)]) 分為兩個部分&#xff1a; cpu.gprcheck_reg_idx c…

深度學習——手寫數字識別

深度學習——手寫數字識別 學習深度學習的朋友應該對MNIST數據集不陌生吧&#xff0c;相信很多人在剛開始學習深度學習的時候都會用到MNIST數據集進行書寫數字識別。本篇文章參考魚書創建一個深度網絡來進行書寫數字識別的任務。 如上圖所示&#xff0c;這里使用的卷積層全都是…

HashMap算法高級應用實戰:頻率類子數組問題的5種破解模式

本文將深入剖析5種基于HashMap的高級模式&#xff0c;通過原理詳解、多語言實現、性能對比和工業級應用&#xff0c;助您徹底掌握頻率類子數組問題。 1. 深入解析&#xff1a;頻率類子數組問題 1.1 問題定義與分類 頻率類子數組問題是指需要統計或查找滿足特定元素頻率條件的…

【精選】計算機畢業設計HTML5智能寵物尋找與領養系統 跨平臺寵物匹配 地圖定位找寵 領養申請審核系統源碼+論文+PPT+講解

博主介紹&#xff1a; ?我是阿龍&#xff0c;一名專注于Java技術領域的程序員&#xff0c;全網擁有10W粉絲。作為CSDN特邀作者、博客專家、新星計劃導師&#xff0c;我在計算機畢業設計開發方面積累了豐富的經驗。同時&#xff0c;我也是掘金、華為云、阿里云、InfoQ等平臺…

拼多多商家端 anti_content 補環境分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 部分python代碼 import execjs impor…

電腦、手機長時間不關機可以嗎

電腦和手機常年處于開機狀態&#xff0c;只有在沒電或者系統提示更新的時候才會關機。那問題來了&#xff0c;電腦、手機長時間不關機到底可不可以呢&#xff1f;今天咱們就來好好嘮嘮。 手機長時間不關機的情況 先來說說手機。現在的智能手機功能越來越強大&#xff0c;我們…

「AI大數據」| 《華為:面向智能制造的工業大模型標準化研究報告》

今天給大家介紹 《華為:面向智能制造的工業大模型標準化研究報告》&#xff0c;這是一份由中國電子技術標準化研究院聯合華為等多家企業編寫的權威報告&#xff0c;聚焦工業大模型在智能制造領域的標準化發展。報告詳細分析了工業大模型的技術架構、應用場景、標準化現狀與挑戰…

Dinky1.2.3基于Kubernetes Application模式提交Flink作業

前言 Dinky 是一個開箱即用、易擴展&#xff0c;以 Apache Flink 為基礎&#xff0c;連接 OLAP 和數據湖等眾多框架的一站式實時計算平臺&#xff0c;致力于流批一體和湖倉一體的探索與實踐。 致力于簡化Flink任務開發&#xff0c;提升Flink任務運維能力&#xff0c;降低Flink…

【軟考高級架構設計師】——2025年上半年軟考真題(回憶版)

目錄 一、綜合知識1.1、計算機基礎與操作系統(15道單選)1.2、軟件工程與架構(16道單選)1.3、數據與網絡(8道單選)1.4、數學與邏輯(4道單選)1.5、其他(27道單選)1.6、英文題(質量屬性)(5道單選)二、案例分析2.1、大模型訓練系統(必選題)2.2、醫院知識圖譜(可選…

哈夫曼樹Python實現

哈夫曼樹構建原則&#xff1a; .統計頻率&#xff1a;對待編碼字符&#xff08;或數據塊&#xff09;的頻率進行統計。.初始化森林&#xff1a;將每個字符視為一棵只有根節點的二叉樹&#xff0c;權值為頻率。.合并樹&#xff1a;重復以下操作&#xff0c;直到只剩一棵樹&…

Dockerfile的學習與實踐

Dockerfile通過一系列的命令和參數&#xff0c;構建自定義鏡像。一般步驟如下&#xff1a; 一. 常用命令說明 基礎命令具體命令描述例子FROMFROM[基礎鏡像:版本號]基于指定的基礎鏡像構建自定義鏡像FROM eclipse-temurin:17-jdk-alpineRUNRUN構建容器需要運行的命令&#xff0…

【三大前端語言之一】靜態網頁語言:HTML詳解

你知道你在瀏覽器中所看到的每一個按鈕&#xff0c;每一個框&#xff0c;都是怎么創造出來的嗎&#xff1f;它們并非魔法&#xff0c;而是由一種被稱為HTML的語言精心構建的骨架。作為前端世界的三大基石之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;HTML是萬…

04、誰發明了深度學習的方法,是怎么發明的?

深度學習的發展是多位研究者長期探索的結果,其核心方法的形成并非由單一人物 “發明”,而是歷經數十年理論積累與技術突破的產物。以下從關鍵人物、核心技術突破及歷史背景三個維度,梳理深度學習方法的起源與發展脈絡: 一、深度學習的奠基者與關鍵貢獻者 1. Geoffrey Hin…

Jmeter ServerAgent在arm環境啟動報錯no libsigar-aarch64-linux.so in java.library.path

使用Jmeter壓測的時候&#xff0c;用ServerAgent監測arm服務器的性能指標&#xff0c;在啟動ServerAgent時&#xff0c;報錯了&#xff1a;no libsigar-aarch64-linux.so in java.library.path 解決方案&#xff1a; 下載libsigar-aarch64-linux.so文件&#xff0c;放置在Serv…

AJAX攔截器失效排查指南:當你的beforeSend有效但error/complete沉默時

問題現象 開發者常遇到這樣的場景&#xff1a; $.ajaxSetup({beforeSend: () > console.log("? 觸發"), // 正常執行error: () > console.log("? 未觸發"), // 靜默失效complete: () > console.log("? 未觸發") // 同樣沉默 })…

【模型微調】負樣本選擇

1.核心設計理念 非對稱檢索任務&#xff08;例如&#xff0c;用一個簡短的問題去文檔庫里查找答案&#xff09;的一個核心挑戰是查詢&#xff08;query&#xff09;和文檔&#xff08;passage&#xff09;在文本特征上的巨大差異。以往的研究發現&#xff0c;為查詢和文檔提供…

下載安裝redis

有任何問題&#xff0c;都可以私信博主&#xff0c;共同探討學習。 正文開始 一、下載安裝redis一、啟動redis總結 一、下載安裝redis redis官方下載地址是github&#xff0c;有條件的同學可以自行搜索下載。針對部分網速不太好的同學&#xff0c;可以通過網盤獲取&#xff0c…

flutter 項目配置Gradle下載代理

如圖&#xff0c; 在Android Studio中配置代理是不生效的。 需要在flutter sdk的Gradle中去配置代理

世冠科技亮相TMC,以國產MBD工具鏈賦能汽車電控系統開發新未來

2025年6月12日至13日&#xff0c;第十七屆國際汽車動力系統技術年會&#xff08;TMC2025&#xff09;在南通國際會展中心盛大召開。作為全球汽車動力系統領域規模最大、規格最高、內容最前沿的標桿性國際盛會&#xff0c;匯聚了來自全球整車企業、核心零部件供應商、頂尖科研機…

將本地項目與遠程 Git 倉庫關聯的完整步驟

將本地項目與遠程 Git 倉庫關聯的完整步驟 現在的情景是&#xff1a;本地文件項目已經寫好了&#xff0c;亦或者遠程倉庫已經建好了&#xff0c;需要與本地項目關聯起來 以下是詳細的操作流程&#xff0c;我會用清晰的步驟說明如何將你的本地項目與遠程 Git 倉庫關聯&#xf…