Refer below code
public void acquire(){ synchronized(a){ print("acquire()"); try{ //Thread.sleep(5000); synchronized(this){ wait(5000); } print("I have awoken"); print("" + a); }catch(Exception e){ e.printStackTrace(); } } print("Leaving acquire()"); } public void modify(int n){ print("Entered in modfy"); synchronized(a){ try{ //Thread.sleep(5000); synchronized(this){ wait(5000); } this.a=n; print("new value" + a); }catch(Exception e){ e.printStackTrace(); } } }
And
final SynchoTest ttObj = new SynchoTest(); Thread A = new Thread(new Runnable(){ public void run() { ttObj.acquire(); } },"A"); Thread B = new Thread(new Runnable(){ public void run() { ttObj.modify(97); } },"B"); A.start(); B.start();
As i know about wait(n), it pauses a thread until notify()/notifyAll() get called or the specified time n is over.
But...
- In above methods if I directly use wait(n) as I used Thread.sleep(n), I get runtime exception.
- If I synchronize both methods instead of surrounding wait(n) with synchronized block then I am not getting any exception but both threads get blocked forever.
- But if I do like I attached ie wait(n) surrounding with synchronized block, it is working fine.
Please tell me why? Also tell me why is it not behaving different on positioning synchronized block if I use sleep(n) instead of wait(n)?
My question is about various result of wait(n) on various position of synchronized keyword.
@Gray
notify() or notifyAll(), and wait() must be in a synchronized block for the object you are waiting on
explained me why I was getting run time exception by positioning synchronized block on various position.
Now please explain me, why
public void method(){ synchronized(a){ synchronized(this){ wait(n); } } }
is working fine. But
public synchronized void method(){ synchronized(a){ wait(n); } }
is blocking my thread forever.