![](/img/trans.png)
[英]How does multiple threads acquire and release lock in synchronized methods and synchronized blocks in java?
[英]Is it true that synchronized blocks in java acquire the whole object lock?
我知道Java中的同步方法如何工作。
假設我們在一個類中有3個同步方法。 如果一個線程訪問了可用方法中的1個,則其他2個被其他線程阻塞。
如果將方法1中的同步實現更改為:
synchronized (this) {...}
它仍然以相同的方式工作並阻止其他兩種方法嗎?
Java教程的“ 固有鎖和同步” (重點是我的)一節對此進行了解釋:
當線程調用同步方法時, 它將自動獲取該方法對象的內在鎖,並在方法返回時釋放該內在鎖 。 即使返回是由未捕獲的異常引起的,也會發生鎖定釋放。
因此,答案是肯定的。
是。
當應用到方法時, synchronized
關鍵字等效於將方法的內容包裝在synchronized(this)
。
規范說 :
同步方法在執行之前先獲取一個監視器(第17.1節)。
對於類(靜態)方法,使用與該方法的類的Class對象關聯的監視器。
對於實例方法,使用與此相關聯的監視器(為其調用方法的對象)。
是的,它確實。
public synchronized void method() {...}
使用對象的內部鎖( this
),因此使用該鎖的任何其他同步塊:
synchronized(this) {...}
如果鎖已被持有,將阻止。
注意:如果方法是靜態的,則圖片將有所不同,因為鎖定不再是this
鎖定,所以它是YourObject.class
。 在下面的示例中,沒有什么阻止線程T1運行method
而另一個線程T2運行someOtherMethod
,因為這兩個部分沒有使用相同的鎖:
public static synchronized void method() {...}
public void someOtherMethod() {
synchronized(this) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.