心智圖資源庫 Java並行
這是一篇關於Java並發的心智圖,主要內容包括:鎖,線程池,並發容器,基本概念。
編輯於2024-04-22 19:41:17Java並行
基本概念
行程
堆疊
方法區
堆和方法區是所有線程共享的資源,其中堆是進程中最大的一塊內存,主要用於存放新創建的對象(幾乎所有對像都在這裡分配內存),方法區主要用於存放已被加載的類別資訊、常數、靜態變數、即時編譯器編譯後的程式碼等資料。
執行緒
程式計數器
虛擬機器堆疊
本地方法堆疊
一個進程中可以有多個線程,多個線程共享進程的堆和方法區 (JDK1.8 之後的元空間)資源,但是每個線程都有自己的程式計數器、虛擬機器堆疊 和 本地方法堆疊。
並行
平行
容易導致記憶體洩漏、死鎖、線程不安全
同步
非同步
線程安全
創建線程
線程的生命週期和狀態
新建(NEW)
就緒(Runnable)
運行(Running)
阻塞(Blocked)
同步阻塞(Blocked)
等待阻塞(WAITING)
超時等待阻塞(TMME-WAITING)
死亡(Dead/TERMINATED)
線程上下文切換
執行緒死鎖
死鎖四個必要條件
如何預防死鎖
如何排查
圖形化:jconsole
jps -l 查出程式進程號,jstack 進程編號
JMM
定義
背景
CPU和快取一致性
處理器最佳化
指令並行重排
編譯器最佳化重排
記憶體系統重排
並發理論
as-if-serial規則
happens-before規則
程序順序規則
監視器鎖規則
volatile變數規則
傳遞性規則
start()規則
join()規則
三大特性
原子性
可見性
有序性
如何解決並發問題
三大關鍵字
volatile
可見性
happens before原則
原理
寫的內存語義
讀的內存語義
有序性
內存語義的實現
synchronized
作用
原子性
有序性
可見性
寫的內存語義
讀的內存語義
使用方式
修飾實例方法
修飾靜態方法
修飾程式碼區塊
原理
同步程式碼區塊
同步方法
java物件模型
對象頭
Mark Word
Klass Point
實例數據
位元組對齊
鎖升級
無鎖
鎖狀態
偏向鎖
鎖狀態
升級時機
具體操作
好處
偏向線程ID與當前線程ID不一致
競爭成功
競爭失敗
技術實現
輕量級鎖
鎖狀態
升級時機
作用
自旋
和偏向鎖區別
重量級鎖
鎖狀態
升級時機
原理
jdk1.6優化
自旋鎖
適應性自旋鎖
鎖消除
鎖粗化
偏向鎖
輕量級鎖
final
作用
重新排序規則
寫 final 域的重排序規則
讀 final 域的重排序規則
內存屏障
並發容器
List
CopyOnWriteArrayList
Vector
Set
CopyOnWriteArraySet
Map
ConcurrentHashMap
ConcurrentSkipListMap
HashTable
queue
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
SynchronousQueue
執行緒池
定義
優勢
降低資源消耗
提高反應速度
提高線程的可管理性
創建方式
Executors
FixedThreadPool
SingleThreadExecutor
概使用的是無界的 LinkedBlockingQueue,任務隊列最大長度為 Integer.MAX_VALUE,可能堆積大量的請求,從而導致 OOM
CachedThreadPool
使用的是同步佇列 SynchronousQueue, 允許建立的執行緒數量為 Integer.MAX_VALUE
ScheduledThreadPool
使用的無界的延遲阻塞隊列DelayedWorkQueue,任務隊列最大長度為 Integer.MAX_VALUE,可能堆積大量的請求,從而導致 OOM。
ThreadPoolExecutor
常見參數
corePoolSize
maximumPoolSize
workQueue
keepAliveTime
unit
threadFactory
handler
AbortPolicy
CallerRunsPolicy
DiscardPolicy
DiscardOldestPolicy
處理任務的流程
如何設定執行緒池的大小
理論演算法
經驗法
CPU 密集型任務(N 1)
I/O 密集型任務(2N)
Future 類
取消任務
判斷任務是否取消
判斷任務是否已經執行完成
取得任務執行結果
缺點
CompletableFuture
解決Future的缺點
優點
CompletionStage
鎖
基本概念
悲觀鎖
優點
悲觀鎖的開銷是固定的
缺點
激烈的鎖競爭會造成線程阻塞
大量阻塞線程會導致系統的上下文切換 增加系統的效能開銷
悲觀鎖還可能存在死鎖問題
適用場景
多寫場景,競爭激烈(避免頻繁失敗和重試影響效能)
樂觀鎖
優點
不存在鎖定競爭造成執行緒阻塞
不會有死鎖的問題
缺點
如果衝突經常發生(寫得比非常多的情況),會頻繁失敗和重試
適用場景
多讀場景,競爭較少(可以避免頻繁加鎖影響效能)
實現方案
版本號碼機制
CAS 演算法
ABA 問題
循環時間長開銷大
只能保證一個共享變數的原子操作
ThreadLocal
作用
原理
Hash 演算法
Hash 衝突
內存外洩問題
原因
解決方案
AQS
核心思想
state
CLH隊列
結構
原理
優點
效能優異,取得和釋放鎖定開銷小。
公平鎖
實現簡單,易於理解
擴展性強
缺點
自旋操作,當鎖持有時間長時會帶來較大的 CPU 開銷
功能單一,不能支援複雜的功能
CLH隊列變異體
AQS 將自旋操作改為阻塞執行緒操作
鎖定資料結構的改進
擴展每個節點的狀態
SIGNAL
PROPAGATE
CONDITION
CANCELLED
明確的維護前驅節點和後繼節點
出隊節點明確設為 null 等輔助 GC 的最佳化
原理圖
共享鎖
獨佔鎖
ReentrantLock
是什麼
原理
非公平加鎖流程
線程一加鎖成功時
AQS內部數據
執行緒二加鎖失敗
CLH隊列情況
線程三加鎖失敗
公平鎖加鎖過程
解鎖過程
釋放鎖的過程
等待隊列數據
最終隊列數據
Condition
實現原理
ReentrantReadWriteLock
適用場景
線程持有讀鎖還能取得寫鎖嗎
讀鎖為不能升級為寫鎖
Semaphore
兩種模式
公平模式
非公平模式
原理
CountDownLatch
作用
原理
一次性
CyclicBarrier
Atomic 原子類
基本類型
AtomicInteger
AtomicLong
AtomicBoolean
數組類型
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
引用類型
AtomicReference
AtomicStampedReference
物件的屬性修改類型
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater