| 特性 | 定義 | 典型違反場景 |
|---|---|---|
| 原子性 | 操作不可分割,執行中不被打斷 | i++(讀-改-寫)、32位 JVM 讀 64位 long/double |
| 可見性 | 一執行緒修改共享變數,其他執行緒立即可見 | 編譯器優化缓存寄存器、指令重排、CPU 緩存一致性延遲 |
| 有序性 | 程式執行順序符合代碼邏輯順序 | 編譯器/CPU 指令重排(流水線優化)、單執行緒語義保證但多執行緒觀測亂序 |
現代 CPU 採用**流水線**並行執行指令(取指→解碼→執行→存取→寫回)。為填充數據相關導致的氣泡,編譯器/CPU 會在**不違反單執行緒語義**前提下重排指令。多執行緒下可觀測到亂序。
volatile 變數立即刷新主存;讀取強制從主存載入volatile int i; i++; 仍非原子定義操作偏序關係,若 A hb B,則 A 結果對 B 可見。核心規則:
volatile hb 後續讀同變數unlock hb 後續 lock 同鎖finalize()| 級別 | 定義 | 典型類 |
|---|---|---|
| 不可變 | 狀態構造後永不改變 | String, Long, final 欄位物件 |
| 絕對線程安全 | 任何調用無需外部同步 | ConcurrentHashMap, CopyOnWriteArrayList |
| 相對線程安全 | 單操作安全,複合操作需外部同步 | Vector, Collections.synchronizedList |
| 線程兼容 | 非安全,需外部同步 | ArrayList, HashMap |
| 線程對立 | 無法在多執行緒使用 | System.setOut, 非線程安全單例懶漢式 |
AtomicReference、LongAdder)volatile 或 final(安全發布)volatile 修飾實例)happens-before 推導可見性,而非憑直覺加鎖JMM 為 Java 併發提供了嚴格語義基石,理解其規則是編寫正確高效併發程式的前提。