2012-05-27 35 views
-2

我有一個基本的疑問。 同步塊內部調用等待,但是當有2個線程正在訪問同步鎖定的塊時,我想當一個線程已經進入同步了,另一個線程不能進入塊?但是我看到它發生了,一旦wait()被執行,其他線程就會進入臨界區。所以2個線程在臨界區內作爲一個線程,等待wait()調用。這真的是它的工作方式?所有這些年來,我一直認爲同步塊內可能只有一個線程。爲什麼甚至wait()被調用時,線程沒有通過內部同步

請幫我理解..........你的幫助。我已經看到了各種鏈接,你用我的個人話來解釋我的工作只是一段,對我來說很重要。

三江源

+3

您應該閱讀wait()方法的javadoc。 –

+0

這個問題似乎是無關緊要的,因爲等待方法的javadoc解釋了你需要知道的一切...... –

回答

1

調用wait暫停執行線程,並釋放由同步舉行的鎖。當通過調用notify()或notifyAll()結束wait()時,在從wait()返回之前重新獲取該鎖。

1

當在對象上調用wait時,對象上的鎖自動釋放以允許其他線程進度。例如:

synchronized(obj) { 
    obj.wait(); 
} 

當一個線程獲取關於obj鎖,然後調用obj.wait()線程被掛起,並在對象obj鎖被釋放,以允許另一個線程調用obj.notify()例如。

javadoc說,它很清楚:

當前線程必須擁有該對象的監視器。該線程發佈 此監視器的所有權,並等待直到另一個線程通過 線程通知調用notify方法或notifyAll方法時,通過 喚醒等待此對象監視器的線程。然後線程 等待,直到它可以重新獲得顯示器的所有權並恢復執行 。

相關問題