Pavan
Pavan

Reputation: 1289

This Code can Throw an IllegalMonitorStateException

void waitForSignal(){
    Object ob =new Object();

    synchronized (Thred.currentThread()) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

This Methods Throws an IllegalMonitorStateException. Can some one explain why so.

Thanks in advance

Upvotes: 0

Views: 642

Answers (3)

Evgeniy Dorofeev
Evgeniy Dorofeev

Reputation: 135992

If even you fixed your problem with IllegalMonitorException like

void waitForSignal() {
    Object ob = new Object();
    synchronized (ob) {

your code won't work. In your code each thread creates a new lock, invisible outside the method. No chance for other threads to notify waiting threads.

Upvotes: 0

Rohit Jain
Rohit Jain

Reputation: 213193

You should only invoke wait on the object that you have acquired lock on.

In your code, you have acquried lock on Thread.currentThread(), but you are invoking it on ob, which will throw IllegalMonitorStateException.

So, you should rather change your synchronized block to: -

synchronized (ob) {

}

Upvotes: 4

jco.owens
jco.owens

Reputation: 535

You want to synchronize on the object you are waiting:

synchronized (ob) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Upvotes: 1

Related Questions