如果不在同步块中使用 wait 和 notify 方法会怎样?有用吗?

what happen if using wait and notify methods not in a synchronized blocks ? is it useful?

关于同步的两个问题

  1. 如果在非同步块中使用 wait 和 notify 方法会怎样?有用吗?
  2. synchronized对象和wait方法的对象应该一样吗?我可以这样做吗:

    synchronized (o) {
        try {
            this.wait();
        } catch (InterruptedException e) {
    
        }
    }
    
  1. 如果当前线程在调用对象的 wait()notify() 方法之前未能对对象进行 synchronize,则会抛出 IllegalThreadStateException。所以,不,它没有用。

  2. 是的,重申上述内容,线程必须 synchronize 在它调用 wait()notify() 的同一实例上。因此,该示例仅在 o == this.

  3. 时有效

我找不到使用 wait()notify() 的充分理由,因为引入了 java.util.concurrent,而且 synchronized 现在也不太有用了。我向初学者(更易于使用)和高级(更强大和正确)的程序员推荐该包中的高级工具。

1. 您不能在 synchronized 块之外调用 wait()notify()/notifyAll(),这些块在方法调用所属的对象上进行同步。如果你尝试,你会得到一个 IllegalMonitorStateException.

2. 需要 在您的 wait()/notify()/notifyAll() 调用所属的同一对象上进行同步。例如,您的代码将抛出编写的 IMSE。您需要调用 synchronized(this){ ...