2013-09-26 139 views
1

是否有可能在ThreadA中的任何情況下得到'永久等待'的情況。我的意思是通知執行速度快於b.sync.wait();線程永久等待通知案例

class ThreadA { 
     public static void main(String [] args) { 
     ThreadB b = new ThreadB(); 

     b.start(); 

     synchronized(b.sync) 
     { 
      try 
      { 
       System.out.println("Waiting for b to complete..."); 
       b.sync.wait(); 
       System.out.println("waiting done"); 
      } catch (InterruptedException e) {}   
     } 
     } 
} 

class ThreadB extends Thread { 
    int total=0; 
    Integer sync = new Integer(1); 
    public void run() { 


     synchronized(sync) 
     { 
      sync.notify(); 
     } 
    } 
} 

回答

2

是的,這是可能的。一旦你調用b.start()調度程序可能會選擇運行線程B,並且當線程A沒有等待鎖時,它會立即獲得鎖和調用通知。在這種情況下,威脅A稍後將獲得鎖定並繼續等待。

如果您需要確定性行爲,則只有在您開始等待通知後,才應該撥打b.start()

+0

這意味着在我的處境Java Memory Visibility或第17章,萬一我需要避免睡forewer我一定要叫b.start()在一些ThreadC中等待ThreadA。 – vico

+0

@ user1501700沒錯。一般來說,現在不鼓勵使用'wait()'和'notify()',因爲我們有'java.util.concurrent'包。例如,CountDownLatch可以完成你需要的操作(A中的'await()',B中的countDown()),而沒有同步。 –

0

不保證您的線程執行順序。有可能(並且據我記得,線程傾向於使用Java)在調用wait()之前會發生通知

你幾乎可以永遠不會假設某件事會在另一件事之前發生。

對於創造的之前發生關係操作的列表,請參閱:的The Java™ Language Specification