The wait() method on an object can be called only in the synchronized context i.e. the current thread must have a lock on the object to invoke the wait()
wait releases the synchronized context. From the documentation:
The current thread must own this object's monitor. The thread releases
ownership of this monitor and waits until another thread notifies
threads waiting on this object's monitor to wake up (...)