簡體   English   中英

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.

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