簡體   English   中英

我可以調用一個同步方法,該方法調用一個調用同步方法的非同步方法嗎?

[英]Can I call a synchronized method that calls a non-synchronized method that calls a synchronized method?

在Java中,使用synced關鍵字都在單個對象和線程中。

我可以調用一個同步方法,該方法調用一個非同步方法,該非同步方法調用一個同步方法,而最終同步方法不會阻塞第一個同步方法的完成嗎?

有了一個對象和一個線程,就沒有問題。

您唯一的線程能夠獲取所有鎖,並且由於重新進入,它可以獲取多次。

即使我們添加另一個線程,它也將起作用(使用一個對象)。 一個線程將獲得第一個鎖,阻塞第二個線程,並且執行將繼續正常進行。

對於多個線程和多個對象,答案是“這取決於代碼的編寫方式”。

您的代碼始終可以調用一個方法,無論它是否同步。 一個更好的問題是,當您的代碼調用它時會發生什么。

如下所示的同步方法:

synchronized void foobar() {
    doSomething();
}

實際上,這只是編寫此代碼的一種簡便方法:

void foobar() {
    synchronized(this) {
        doSomething();
    }
}

因此,有關調用同步方法的任何問題實際上就是有關執行同步塊的問題 當您的代碼進入synchronized(this) {...}時,可能會發生三件事。

1)如果未鎖定this對象,則它將以調用線程的名稱鎖定,該線程將執行塊中的語句,然后在完成鎖定后將其解鎖。

2)如果this對象已被調用線程鎖定,則該線程將僅執行該塊中的語句。

3)如果this對象被某個其他線程鎖定,則調用線程將等待,直到另一個線程將其解鎖為止,然后它將像情況(1)一樣繼續進行。

麻煩的唯一方法是代碼嘗試鎖定兩個不同的鎖。 然后,如果您的設計沒有經過深思熟慮,則兩個或多個線程可能會死鎖 ,這是您可以在其他地方閱讀的內容。

如果一個類同時具有同步方法和非同步方法,則多個線程仍可以訪問該類的非同步方法。如果您的方法不訪問您要保護的數據,則不需要同步他們。 在某些情況下,同步可能會導致命中(如果使用不正確,甚至會導致死鎖)

暫無
暫無

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

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