2013-08-28 3 views
0

klocwork Проблема JD.LOCK.WAIT сообщается при вызове метода Object.wait(), когда метод удерживает две или более блокировки.Почему метод wait() в синхронизированном блоке имеет тупик?

klocwork говорит, что ожидание на мониторе при наличии двух замков может привести к взаимоблокировке, и проблема должна быть принята во внимание.

Но я не могу понять, почему это вызывает тупик.

Кто может помочь мне понять эту проблему?

Следующий код из klockwork. Проблема JD.LOCK.WAIT возникает в строке 14 lock.wait();.

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

ответ

1

Допустим t1 входит метод waitForCondition(). Таким образом, t1 теперь имеет this как замок. Между тем, какая-то другая тема только что приобрела объект lock и пытается позвонить waitForContion().

  • t2 держит lock, но ждет this ввести waitForContion().

  • t1 держит this, но ждет lock для выхода waitForContion().

Это тупиковый. Ни один из них не может добиться какого-либо прогресса и ждет друг друга.

Чтобы избежать этого, одна из стратегий заключается в том, чтобы убедиться, что у любого потока есть все необходимые ему ресурсы. Здесь это означает, что lock и this могут быть приобретены вместе, а не иначе.

Также, когда вызывается lock.wait(), только lock освобождается, а this - нет. Таким образом, в этом случае нить не может вызвать waitForContion() на объекте that.

+0

Если я изменил параметр синхронизированного метода от блокировки объекта до команды byte [] (например), мне не нужно беспокоиться о тупике? – 500004dolkong

+0

Я не понимаю, как это поможет. Есть два замка (объект 'this' и объект' lock'), вы хотите приобрести их вместе и освободить их вместе. – rocketboy

+0

Я вижу. большое спасибо. – 500004dolkong