在对象上发出通知后返回到同步块后,Java 的行为是什么?



我知道,在我们对对象调用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 方法通知等待此对象监视器的线程唤醒。然后,线程将等待,直到它可以重新获得监视器的所有权并恢复执行。

最新更新