2013-08-05 40 views
1

雖然有很多關於這個主題的文章和SO帖子,我仍然有一些疑問。所以請幫助我理解。說我寫:對象等待()和通知()重訪

1.Class A(){} 
2.public static void main(String[] s){ 
3. A obj= new A(); 
4. synchronized(obj){ 
5.  while(!condition) 
6.   obj.wait(); 
7. } 
8.} 

現在根據解釋,如果我們不使用同步塊,線程從睡眠喚醒可能會鬆動通知。但第6行釋放了對obj的鎖定,即其監視器由另一個線程擁有。 現在,當該線程調用notify()時,由於obj的監視器不屬於此線程,因此該線程如何得到通知。此外,第4行代碼只執行一次,而不是此線程的每個喚醒事件。那麼wait()之前同步的是什麼?

編輯:「第4行代碼只執行一次」錯誤的假設。在answer.Thanks

+1

如果不使用synchronized塊,'wait'會拋出異常下手......(和'wait'只有重新獲得監視器後返回。) –

回答

1

它工作在the javadoc for Object#wait的解釋中提到它們從休眠恢復後同步塊中的線程獲取鎖定,重點煤礦:

這款顯示器並等待線程釋放所有權,直到另一個線程通知調用notify方法或notifyAll方法來喚醒等待該對象監視器的線程。 線程然後等待,直到它可以重新獲得顯示器的所有權並恢復執行。

所以一旦等待的線程被通知,之前進行下指令(:while(!condition)你的情況)重新獲得監視器

0

「那麼究竟什麼是等待()之前同步需要什麼?」 :條件在線程中共享,條件中的任何更改都應該是線程安全的,並且是進行同步的原因。這裏的條件不是一些隨機的條件,但這是你的線程正在等待的東西。 希望這有助於。