[英]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.