一、 併發程式設計的三大核心特性
任何多執行緒安全問題,本質上都是違反了以下三者之一:
原子性(Atomicity):一個或多個操作要嘛全部執行完畢且中途不可被打斷,要嘛完全不執行。
可見性(Visibility):當一個執行緒修改了共享變數的值,其他執行緒能夠立即得知最新修改。
有序性(Ordering):程式執行的順序依照代碼的先後順序執行(編譯器與 CPU 在不改變單執行緒語義的前提下,可能對指令進行重排序最佳化)。
二、 Java 記憶體模型(JMM, Java Memory Model)抽象結構
現代多核心CPU都有各自獨立的高速快取(L1/L2/L3 Cache),JMM定義了一套規範來遮蔽不同硬體快取架構的差異:
三、 volatile 的底層機制與極限volatile是JVM提供的最輕量級同步機制,具備以下兩大保證與一個致命限制:
四、 CAS 機制(Compare-And-Swap)與無鎖併發為了解決原子性問題,傳統做法是使用 synchronized 或 ReentrantLock 加鎖,但鎖機制涉及作業系統線程掛起與上下文切換,開銷昂貴。JUC 引入了基於硬體 CPU 指令的樂觀無鎖機制:CAS。
五、 JUC Atomic 原子類別體系
java.util.concurrent.atomic 套件底層完全基於 volatile + CAS + Unsafe 類別 實作,常見類別劃分:
基本型別原子類:
AtomicInteger、AtomicLong、AtomicBoolean。
常用方法:incrementAndGet()、compareAndSet(expect, update)。
參考型別原子類:
AtomicReference:將整個自訂物件封裝為原子引用。
AtomicStampedReference:帶有整數版本號戳記,徹底解決 ABA 問題。
超高併發計數特化器:LongAdder(Java 8+ 推薦):
在極高併發情境下,大量執行緒同時 CAS 更新同一個 AtomicLong 會引發激烈的自旋消耗。
分段累加思想(Cell Array):LongAdder 將單一變數分散為一個陣列(Cell[]),不同執行緒分散更新不同的 Cell;取總和時呼叫 sum() 將所有 Cell 與 Base 累加合併。在寫入密集的計數場景下,吞吐量遠超 AtomicLong。