可能重複:
What is the Re-entrant lock and concept in general?Java中的鎖再入是用於什麼?
我想了解在Java折返鎖,我在尋找一個簡單的解釋。爲什麼需要鎖定再入境?它解決了什麼問題?一個示例場景會有所幫助。
可能重複:
What is the Re-entrant lock and concept in general?Java中的鎖再入是用於什麼?
我想了解在Java折返鎖,我在尋找一個簡單的解釋。爲什麼需要鎖定再入境?它解決了什麼問題?一個示例場景會有所幫助。
一個可重複鎖定是相同的線程可能獲取不止一次。通常,重入鎖必須被解鎖的次數與鎖定的次數相同。再入式鎖通常更容易編碼。如果你有幾種方法讓A調用B和B調用C ...但是這個代碼的客戶端可以調用A或B或C,並且如果你想在這些方法中鎖定,那麼一個可重入的鎖將解決你的問題問題。它會一次阻止除了一個線程以外的任何線程訪問此代碼,但它將允許多次鎖定採集,因此您不會死鎖自己。
比方說,你有這樣的:
public class SyncTest {
private final Lock lock = new ReentrantLock();
public void doA() {
lock.lock();
try {
doB();
doSomethingForA();
} finally {
lock.unlock();
}
}
public void doB() {
lock.lock();
try {
doC();
doSomethingForB();
} finally {
lock.unlock();
}
}
public void doC() {
lock.lock();
try {
doSomeWorkThatEveryoneDoes();
} finally {
lock.unlock();
}
}
}
,而其他的代碼可以調用任何doA
或doB
或doC
和所有的人,周圍用相同的鎖定一些工作同步。使用的鎖是「可重入的」,因爲同一個線程可以多次獲取它。如果鎖不可重入,那麼當您撥打doA
時,當您輸入doB
並嘗試獲取該鎖時,即使該鎖恰好屬於您自己,您也會死鎖,因爲鎖已經擁有。
例如,初始化爲一個計數的純計數信號量是非重入鎖。如果同一個線程試圖獲得它兩次,它會永遠阻止一種自我僵局。
不完全重複。這個問題更加具體,涉及到一些特定的Java鎖定實現。另一個問題是非常一般的。 – Eddie