簡體   English   中英

方法調用與同步塊之間的“差距” —避免並發死鎖

[英]“gap” between method call and the synchronized block — avoiding deadlock in concurrency

以下方法是SomeType類的方法-它作為其參數的類型。 行注釋指示行號。

synchronized void someMethod(SomeType other) {  // line 1
                                // line 2
    synchronized (other) {      // line 3
        //...do stuff           // line 4
    }
}

指示為“第4行”的塊調用了thisother一些其他同步方法,並且此代碼旨在避免死鎖。

但是-假設同時a.someMethod(b)b.someMethod(a) ,其中ab是不同的實例。

進一步假設b.someMethod(a)被調用后立即a.someMethod(b)是,他們都在行舉行了2--每ab獲得自己的鎖,並等待對方的鎖進行。

可以/不可以嗎?

如果是這樣-在哪些JDK實現上? 除非依賴於jdk規范,否則這似乎取決於特定的實現。

TIA

是的,您描述的僵局可能會發生。 它發生的頻率可能取決於線程代碼的細節。 如今,您最有可能使用操作系統的本機線程,因此它將比JDK / JRE更依賴本機OS。 不過,在大多數平台上都有可能發生死鎖,因此您應該在代碼中加以防范。

如果您認為該方法的爭用程度很低,或者您不關心性能,則可以在靜態成員或類本身上進行同步,而不是在對象上進行同步。 如果您確實關心性能,並且認為爭用會很重要,那么您將需要找出一種方法,以確保監視器以相同的順序鎖定,而與調用該方法的對象以及方法的參數無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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