這是從Joshua Bloch編寫的一本書中摘取的。如果線程試圖獲取它已經擁有的鎖,會發生什麼情況?
我不是英語母語的人,因此有理由要求澄清疑問。
由於內在鎖是可重入的,如果一個線程試圖 收購它已經持有鎖,請求 成功。重入意味着每個線程在 而非**每個調用的基礎上獲取鎖。
通過每個調用的基礎,他意味着每個方法調用? 考慮片段:
class Factoriser{
public synchronized void doSomething(){
// code goes here
}
}
假設有一個線程A,並且能夠在具有實例方法doSomething的對象獲取鎖()。由於某種原因,相同的線程線程A再次獲得對同一個對象實例方法doSomething()的鎖(想象前一個鎖還沒有被釋放)。
如果我正確理解了Joshua的說法,那麼即使有2個方法調用/調用,也只會有一個鎖。我的理解是否100%正確。請舉例說明。我很困惑,因爲提交人在下面的段落中澄清了這一點,這使我更加困惑。
重入是通過將每個鎖與一個採集計數和一個擁有線程相關聯來實現的。當計數爲零時,該鎖被認爲是不受支持的。當線程獲取先前未釋放的鎖定時,JVM將記錄所有者 並將採集計數設置爲1。如果同一個線程 再次獲取鎖定,則計數遞增,並且當擁有線程退出同步塊時,計數遞減 。當計數達到零時,鎖定被釋放。
如果重入/鎖獲取不是基於每個調用的基礎,那麼爲什麼JVM將對上述場景設置爲2來完成計數?
這是一個** ** ** ** ** **。事實上,**有如此多的大膽**,它變得毫無意義**和**分心**。 – Andreas
每個對象只有一個鎖。任何數量的調用只需要相同的鎖(成功)。當最後一個鎖被釋放時,該對象不再被鎖定。爲什麼這很難? – markspace
@Andreas:謝謝。刪除。 –