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

多線程同步:synchronized(new Object{}) 與 synchronized(obj) 的關鍵差異解析

     編輯:程式設計疑難解答

核心問題

在 Java 多線程編程中,synchronized(new Object()){} 和 Object obj = new Object(); synchronized(obj){} 這兩種寫法看似相似,實則行為截然不同。前者會導致多線程並行執行,後者則實現線程串行。這究竟是什麼原因?

代碼示例

class Card implements Runnable {
    private static int cards = 100;
    Object obj = new Object();

    public void run() {
        while (true) {
            synchronized(obj) { // 若改為 synchronized(new Object()) 則失去同步效果
                if (cards > 0) {
                    try { Thread.sleep(10); } catch (Exception e) {}
                    System.out.println(Thread.currentThread().getName() + "------" + cards--);
                } else {
                    break;
                }
            }
        }
    }
}

深度解析

寫法一:synchronized(new Object())

每次進入同步塊時,new Object() 都會創建一個全新的鎖對象。四個線程各自持有不同的鎖,自然不存在競爭關係,因此呈現並行執行狀態。這實際上失去了同步互斥的意義。

寫法二:synchronized(obj) 其中 obj 為成員變量

obj 作為類的成員變量,在對象創建時初始化一次。所有線程共享同一個 Card 實例(示例中 `new Card()` 僅創建一次),因此共用同一把鎖。線程間產生競爭,被迫串行執行,達到線程安全目的。

關鍵總結

  • 鎖對象必須共享:同步機制的前提是多線程操作同一把鎖。
  • 避免在 synchronized 內部 new 對象:這會導致每次獲取的鎖不同,同步失效。
  • 最佳實踐:使用 `private final Object lock = new Object();` 或鎖定 `this` / `類.class` 等固定引用。

理解這一點,是掌握 Java 並發編程基石的關鍵一步。

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