簡體   English   中英

鎖定類的靜態成員

[英]Locking static members of a class

根據我的理解,以下代碼段將導致死鎖。 原因是,當線程t1鎖定靜態對象firstData時,他已經獲得了對該類的鎖定。 因此,當他嘗試鎖定另一個靜態對象secondData時,請求將被阻止。

但是,該程序可以正常運行並打印*** Successfully acquired both the locks

鎖定此處缺少的靜態對象是什么?

public class Deadlock {
    public static void main(String[] args) {

        Thread t1 = new Thread(new DeadlockRunnable());
        t1.start();
    }
} 

 class DeadlockRunnable implements Runnable {
    static  Object firstData = new Object();
    static  Object secondData = new Object();

    public void run() {
        synchronized(firstData) {
            synchronized(secondData) {
                System.out.println("*** Successfully acquired both the locks");
            }
        }
    }

}

對於那些誰回答了鎖的對象,而不是類,請看看這個

首先,您在這里有一個錯誤:

原因是,當線程t1鎖定靜態對象firstData時,他已經獲得了對該類的鎖定。

鎖定靜態對象只會鎖定該對象,而不會鎖定類。 您正在鎖定兩個單獨的對象。

您提到問題是關於同步方法而不是同步語句 這兩個相關的構造工作方式略有不同。


其次,即使您鎖定了同一對象,您的代碼仍不會死鎖( ideone )。 內部鎖是可重入的 這意味着,如果一個線程嘗試進行兩次相同的鎖定,它本身不會死鎖。

重入同步

回想一下,一個線程無法獲取另一個線程擁有的鎖。 但是線程可以獲取它已經擁有的鎖。 允許一個線程多次獲取相同的鎖將啟用重入同步。 這描述了一種情況,其中同步代碼直接或間接調用一個也包含同步代碼的方法,並且兩組代碼使用相同的鎖。 如果沒有可重入同步,則同步代碼將不得不采取許多其他預防措施,以避免線程導致自身阻塞。

資源

“當線程t1鎖定靜態對象firstData時,他已獲取該類的鎖”
不知道為什么會這樣。 t1獲得對firstData的鎖定,而不是對包含類的鎖定。 在您的代碼中沒有可能的死鎖。

編輯
在您發表評論之后,該鏈接是關於這兩個聲明之間的區別的:

public synchronized method() // lock on the instance (this)
public static synchronized method() // lock on the class (Myclass.class)

但是,死鎖沒有聯系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM