Why does 'wait() method within synchronized block' have deadlock possibility?

718 views Asked by At

klocwork JD.LOCK.WAIT issue is reported when an Object.wait() method is called while the method is holding two or more locks.

klocwork says that waiting on a monitor while two locks are held may cause deadlock and the issue should be taken into account.

But I cannot understand why this causes deadlock.

Who can help me understand this issue?

Following code is from klockwork. The JD.LOCK.WAIT issue occurs on line 14 lock.wait();.

String name;
synchronized void waitForCondition(Object lock) {
    try {
        synchronized(lock) {
            name = "aa";
            lock.wait();            //line 14
        }
    } catch (InterruptedException e) {
        return;
    }
}
1

There are 1 answers

2
rocketboy On BEST ANSWER

Lets say t1 enters the waitForCondition() method. So t1 now has this as a lock. Meanwhile, some other thread has just acquired lock object and is trying call waitForContion().

  • t2 holds lock but is waiting for this to enter waitForContion().

  • t1 holds this but is waiting for lock to exit waitForContion().

That is a deadlock. Neither of them can make any progress and are waiting on each other.

To avoid this, one strategy is to make sure any thread has all the resources it needs to complete. Here it means that lock and this can only be acquired together and not otherwise.

Also, when lock.wait() is called, only lock is released while this is not. So, in such a case no thread can call waitForContion() on that object.