2017-04-20 93 views
2

我對同步方法感到困惑。看看這段代碼如下:Android/java:同步對象等待並通知

public void waitOne() throws InterruptedException 
{ 
    synchronized (monitor) 
    { 
     while (!signaled) 
     { 
      monitor.wait(); 
     } 
    } 
} 

public void set() 
{ 
    synchronized (monitor) 
    { 
     signaled = true; 
     monitor.notifyAll(); 
    } 
} 

現在,據我所知,同步意味着只有1個線程可以訪問裏面的代碼。如果WaitOne的()主線程組稱爲()子線程叫,然後(從我的理解),它會創建僵局

這是因爲主線程從未退出同步(顯示器),因爲​​,因此呼籲從子線程永遠不會抽到同步(顯示器)集()

我對不對?或者我錯過了什麼?完整的代碼是在這裏:What is java's equivalent of ManualResetEvent?

感謝

+0

如果您在用於同步的對象上調用wait,它將允許另一個線程訪問該對象。這段代碼不會死鎖 – 0xDEADC0DE

+0

啊......我看......謝謝0xDEADC0DE。請在上面寫一篇文章,我會接受你的回答:) – Sam

回答

2

當你調用wait您使用同步,它會釋放監視器,允許另一個線程來獲得它的對象上。這段代碼不會死鎖。

2

查看wait()方法的文檔。

導致當前線程等待,直到另一個線程調用此對象的notify()方法或notifyAll()方法。換句話說,這個方法的行爲就好像它只是執行呼叫等待(0)一樣。

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

關鍵是線程釋放顯示器的所有權,因此你不會死鎖。子線程可以設置signaled的值並且可以通知主線程。