2017-04-20 92 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的值并且可以通知主线程。