Suppose I have the following situation:
synchronized void someMethod() {
...
try {
wait();
}catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
...
}
and
synchronized void someOtherMethod() {
...
notify();
}
And the Thread accesses first someMethod, goes into wait and then someOtherMethod notifies it and returns to Runnable state. Does the position of the notify() call in the method matter? I noticed no change in behavior even when I positioned the notify() call at different positions inside the method.
Shouldn’t the Thread be notified immediately when the call to notify() is made?
The position of the
notify()call within thesynchronizedblock does not matter because by definition, if you are still in thesynchronizedblock, then you still hold the lock.Yes. Calling
notify()puts one of the threads (if any) from the wait queue (waiting for the condition) into the blocked queue (waiting for the lock). This does happen immediately, but the awoken thread needs to get the lock before it can start running. So it is immediately moved out of the wait queue but is still waiting to get the lock.Btw, I would recommend writing this as
this.wait()andthis.notify()just to be explicit about which object is being affected.