解释为什么Java中 wait 方法需要在 synchronized 的方法中调用?
参考答案:
在Java中,wait()
、notify()
和notifyAll()
这三个方法是Object类的一部分,它们被用来协调多个线程间的交互。然而,这三个方法只能在synchronized
块或synchronized
方法中调用,原因主要有以下几点:
- 线程安全:这三个方法都涉及到线程间的协作,因此需要确保在调用它们时,相关的对象状态是安全的,并且不会被其他线程同时修改。通过将
wait()
、notify()
和notifyAll()
方法限制在synchronized
块或synchronized
方法中,Java确保了这一点。在synchronized
块或synchronized
方法中,只有一个线程可以访问对象,从而避免了多个线程同时修改对象状态的情况。 - 线程间通信:
wait()
、notify()
和notifyAll()
方法的主要目的是让线程之间能够进行通信。这种通信通常涉及到线程对共享资源的访问和修改。通过在synchronized
块或synchronized
方法中调用这些方法,Java确保了线程间的通信是在一个受控的、线程安全的环境中进行的。 - 避免死锁:如果允许在非
synchronized
块或方法中调用wait()
、notify()
和notifyAll()
,那么可能会导致死锁。例如,一个线程可能在等待某个条件满足时调用了wait()
,但此时如果另一个线程修改了该条件,那么第一个线程可能会永远等待下去,因为它无法得知条件已经发生了变化。通过将这些方法限制在synchronized
块或synchronized
方法中,Java可以避免这种情况的发生。
因此,为了保证线程安全和正确的线程间通信,Java规定wait()
、notify()
和notifyAll()
方法只能在synchronized
块或synchronized
方法中调用。