首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 多線程同步機制詳解:鎖、死鎖與同步粒度

     編輯:Java 綜合教學

Java 多線程同步核心原理

Java 虛擬機通過 對象鎖 實現同步。每個對象(含 Class 對象與實例對象)天生擁有一把鎖及一個等待集。同步方法或同步塊在進入前必須獲取該鎖,釋放鎖時喚醒等待線程。

1. 同步的兩種形式

  • 同步方法:在方法宣告加 synchronized,鎖對象為 this(實例方法)或 Class 對象(靜態方法)。
  • 同步塊:synchronized (lockObj) { ... },鎖對象由開發者指定,粒度更細。

2. 死鎖成因與避免

死鎖發生於多線程循環等待對方持有的鎖。典型場景:

// 線程 1
synchronized (lockA) {
  synchronized (lockB) { ... }
}
// 線程 2
synchronized (lockB) {
  synchronized (lockA) { ... }
}

避免策略:

  1. 固定鎖獲取順序(全局有序)。
  2. 使用 tryLock(timeout) 代替無限等待。
  3. 減少鎖持有範圍,縮短關鍵區。

3. 同步粒度與性能權衡

「粒度越小越好」並非絕對真理:

  • 過細:頻繁進出同步塊,JVM 鎖開銷(CAS、內存屏障、上下文切換)抵消並行收益。
  • 過粗:關鍵區過長,線程串行化嚴重,吞吐率下降。

最佳實踐:針對熱點鎖進行壓測,在「鎖爭用度」與「關鍵區執行時間」間尋找平衡點。對於高併發計數器,優先考慮 LongAdder 或 AtomicLong 無鎖方案。

4. 等待/通知機制

同步塊內可調用 wait() 釋放鎖並進入等待集,notify()/notifyAll() 喚醒。必須在持有鎖狀態下調用,否則拋 IllegalMonitorStateException。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved