繁体   English   中英

在对象上通知后返回同步块后java的行为是什么

[英]what is the behavior of java after returning to a synchronized block after notify on an object

我知道在我们对一个对象调用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()以唤醒所有等待锁的线程是安全的。

我是 Stack Overflow 的新手,所以我不确定我的共享知识是否直接针对问题。

来自wait()Javadoc (强调):

当前线程必须拥有此对象的监视器。 线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象监视器上等待的线程唤醒。 然后线程等待直到它可以重新获得监视器的所有权并恢复执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM