2015-03-31 85 views
0

簡單的問題,但我沒有多線程的經驗。 如果兩個線程使用相同的同步方法(在Java中),並在給定的時間第一個線程不能訪問方法(因爲第二個是使用它),做了一段時間,然後嘗試的第一個線程等待(凍結)再次訪問它,還是隻是放棄,根本不訪問它?訪問java中的同步方法

回答

3

第一種方法的塊,並等待直到當一個線程正在執行的對象同步方法,它可以使用的方法,具體根據doc

,即調用的同步方法的所有其他線程相同的對象塊(掛起執行)直到第一個線程完成對象。

如果我沒有記錯的話,我並不是100%確定的,但如果內存爲我服務,那麼JVM不會保證線程在釋放後能夠獲取鎖的順序。

+0

一個很好的答案鏈接到文檔,並提出一個簡短的相關報價回答問題+1。 – Gnoupi 2015-03-31 13:10:49

+0

^同意。感謝你的回答。我今天一直在這個頁面上看過4次,我沒有注意到這一點。我必須做更少的閱讀和更適當的閱讀。 另外,我只有2個線程,所以順序不是問題。 – JakeDiscBrake 2015-03-31 13:14:02

0

它等待。

JVM不允許兩個線程同時在同一個對象上同步。如果一個線程在第二個線程嘗試同步時已經同步,則第二個線程將進入睡眠狀態並添加到隊列中。

每當一個線程釋放一個鎖(即,當它從一個同步的方法或塊中退出時),該鎖的隊列頭部的線程將被喚醒,然後它將被允許鎖定該鎖。

+0

你確定你最後一句話嗎? – assylias 2015-03-31 13:09:33

+0

@assylias。我只能在JLS中找到它:「當執行線程擁有該鎖時,其他線程無法獲取該鎖。」一個高效和公平的實現要求將使用一個基於隊列的鎖,其行爲將如我所述。其他的實現可能會有不同的行爲,但是他們的行爲可能很難向noob解釋,而且在他的教育階段,這種差異可能並不是那麼重要。 – 2015-03-31 13:21:58