[英]If a synchronized method calls another non-synchronized method, is there a lock on the non-synchronized method
[英]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.