首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java synchronized 鎖對象 vs 鎖方法:this 鎖當前實例、方法鎖隱含 this、静態方法鎖 Class 對象

     編輯:程式設計疑難解答

兩種寫法等價關係

寫法鎖對象等價展開
synchronized(this) { ... }當前實例 this同步塊,僅鎖住大括號內代碼
public synchronized void method() { ... }當前實例 this整個方法體等同於 synchronized(this) { methodBody }
public static synchronized void method() { ... }類對象 MyClass.class等同於 synchronized(MyClass.class) { ... }
synchronized(MyClass.class) { ... }類對象 MyClass.class鎖住所有實例共享的靜態資源

核心差異:鎖粒度與靈活性

  • 同步方法:粗粒度,整個方法互斥,簡單但可能降低並發度。
  • 同步塊:細粒度,可僅鎖住關鍵區段,可指定任意對象為鎖(如 private final Object lock = new Object();),避免暴露 this 被外部惡意鎖死。

最佳實踐:私有鎖對象

public class Account {
    private final Object balanceLock = new Object(); // 不暴露 this
    private long balance = 0;

    public void deposit(long amount) {
        synchronized (balanceLock) { // 僅鎖存款邏輯
            balance += amount;
        }
        // 其他非關鍵操作(日誌、通知)在鎖外執行
        log.info("Deposited: {}", amount);
    }
}

Android 特別提醒

  • UI 線程(主線程)**嚴禁**執行耗時同步塊**,會導致 ANR。
  • 網路下載同步鎖應放在**工作線程**(ThreadPool / Coroutine / RxJava / AsyncTask)中。
  • 若需跨進程同步,請用 FileLock、Mutex (API 26+) 或資料庫事務,synchronized 僅限進程內。

總結

synchronized(this) 與 synchronized method 鎖對象相同(實例),差異在**鎖範圍**。實務中**優先使用私有 final Object 鎖**,精確控制臨界區,避免死鎖與並發度退化。

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