我知道,在我们对对象调用wait()
后,该对象的锁将释放以允许另一个线程通过同步块提供该锁并调用notify()
。 在我们进入我们称之为wait()
方法的同步块之前,我们获取锁并调用wait()
.
但是wait()
后该方法释放锁。
现在我的问题是,在另一个线程中调用notify()
后,等待该对象的线程是否再次获取锁。
下面是一个简单的代码:
Object obj = new Object();
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
afterWait();
}
是 JVM 执行afterWait()
方法时对象获取的锁,因为它也在同步块中。
在Java中,监视器是根据Mess的语义实现的。这意味着当当前线程需要等待时,它会释放监视器并加入其他等待线程以再次获取监视器。编写的示例是不安全的,因为 wait 应该在一个循环中检查某些条件以再次等待,因为 Java 不保证线程仅在notify()
或notifyAll()
方法的情况下被唤醒。它可能适用于您的开发环境,但在另一个环境中失败。此外,notify()
方法不能保证线程会唤醒并获取锁,因为它可能无法获得信号,因此可以安全地notifyAll()
唤醒所有等待锁的线程。
我是堆栈溢出的新手,所以我不确定我的共享知识是否直接解决问题。
来自wait()
年的 Javadoc(着重号是加的(:
当前线程必须拥有此对象的监视器。线程释放此监视器的所有权,并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知等待此对象监视器的线程唤醒。然后,线程将等待,直到它可以重新获得监视器的所有权并恢复执行。