these methods are all inherited from Object. When calling wait() on an instance, the executing
thread goes to sleep until another thread invokes notify() or notifyAll() on the same instance. the difference between notify and notifyAll is that notify only wakes up one thread and notifyAll wakes up all threads waiting on that instance.
As for synchronization, upon waiting the object releases it's locks.