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

深入理解 synchronized(this) 鎖機制

     編輯:Java 程式設計入門

五大核心規則:

  1. 兩執行緒存取同一物件的 synchronized(this) 同步區塊,同一時間僅一執行緒執行,另一執行緒需等待。
  2. 一執行緒在 synchronized(this) 區塊時,另一執行緒仍可存取該物件的非同步區塊。
  3. 一執行緒進入 synchronized(this) 區塊時,其他執行緒對該物件所有 synchronized(this) 區塊的存取將被阻塞。
  4. 規則三同樣適用於 synchronized 方法(隱含 this 鎖)。
  5. 以上規則對其他物件鎖(如 synchronized(otherObj))同樣適用。

程式碼驗證

案例一:同步區塊互斥

public class Thread1 implements Runnable {
    public void run() {
        synchronized(this) {
            for (int i=0;i<5;i++)
                System.out.println(Thread.currentThread().getName()+" synchronized loop "+i);
        }
    }
    public static void main(String[] args) {
        Thread1 t1=new Thread1();
        new Thread(t1,"A").start();
        new Thread(t1,"B").start();
    }
}

輸出:A 完整跑完 0-4,B 再跑 0-4。驗證規則一。

案例二:同步與非同步並行

public class Thread2 {
    public void m4t1() { synchronized(this){ /* 睡眠 500ms 迴圈 */ } }
    public void m4t2() { /* 非同步,相同睡眠迴圈 */ }
    main: 兩執行緒分別呼叫 m4t1、m4t2 → 輸出交替顯示。驗證規則二。
}

案例三:雙同步區塊互斥

將 m4t2() 改為 synchronized(this) → 輸出 t1 完整跑完,t2 再跑。驗證規則三。

案例四:synchronized 方法等同同步區塊

將 m4t2() 改為 public synchronized void m4t2() → 結果同案例三。驗證規則四。

案例五:其他物件鎖

內部類別 Inner,外部類別以 synchronized(inner) 鎖定 inner 物件呼叫 inner.m4t1(),另一執行緒直接呼叫 inner.m4t2()(非同步) → 交替輸出;若 m4t2 也同步 → 互斥。驗證規則五。

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