首页 > 解决方案 > 通知对象后返回同步块后java的行为是什么

问题描述

我知道在我们wait()对一个对象调用 a 之后,该对象的锁将释放以允许另一个线程通过同步块提供该锁并调用notify()。在我们进入调用wait()方法的同步块之前,我们获取锁并调用wait().

但在wait()方法释放锁之后。

现在我的问题是在我们调用notify()另一个线程之后,正在等待该对象的线程是否再次获取锁。

下面是一个简单的代码:

Object obj = new Object();
        synchronized (obj) {
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            afterWait();
        }

是jvm执行afterWait()方法时对象获取的锁,因为它也在同步块中。

标签: javamultithreadingthread-safety

解决方案


在 Java 中,监视器是根据 Mess 的语义实现的。这意味着当当前线程需要等待时,它会释放监视器并加入其他等待线程以再次获取监视器。写的例子是不安全的,因为等待应该在一个循环中检查一些条件以再次等待,因为Java不保证线程只会在notify()ornotifyAll()方法的情况下被唤醒。它可能适用于您的开发环境,但在另一个环境中失败。此外,notify()方法不保证线程会唤醒并获得锁,因为它可能无法获得信号,因此notifyAll()唤醒所有等待锁的线程是安全的。

我是 Stack Overflow 的新手,所以我不确定我的共享知识是否直接解决了这个问题。


推荐阅读