Обнаружение тупиков в Java - PullRequest
       54

Обнаружение тупиков в Java

62 голосов
/ 20 октября 2008

Давным-давно я сохранил предложение из справочника по Java: "У Java нет механизма для обработки взаимоблокировок. Он даже не узнает, что произошел тупик" (Head First Java 2nd Edition, p.516)

Так что с этим? Есть ли способ поймать тупиковую ситуацию в Java? Я имею в виду, есть ли способ, которым наш код понимает, что произошел случай взаимоблокировки?

Ответы [ 15 ]

3 голосов
/ 20 октября 2008

Не совсем то, что вы просили, но когда возникает тупик , вы можете выполнить «kill -3» для идентификатора процесса, и он выгрузит дамп потока в стандартный вывод. Кроме того, 1.6 jvm имеет несколько инструментов, которые делают то же самое в графическом стиле.

2 голосов
/ 21 октября 2008

Если вы отлаживаете в eclipse, вы можете приостановить приложение (выберите приложение в представлении отладки и маленькую кнопку || на панели инструментов отладки), а затем оно может сообщить о взаимоблокировках.

См. http://runnerwhocodes.blogspot.com/2007/10/deadlock-detection-with-eclipse.html для примера.

0 голосов
/ 19 сентября 2017

Java 5 представила ThreadMXBean - интерфейс, обеспечивающий различные методы мониторинга потоков. ... Разница в том, что findDeadlockedThreads также может обнаруживать взаимные блокировки, вызванные блокировками владельца (java.util.concurrent), тогда как findMonitorDeadlockedThreads может обнаруживать только блокировки монитора (то есть синхронизированные блоки)

Или вы можете обнаружить это программно, см. Это https://dzone.com/articles/how-detect-java-deadlocks

0 голосов
/ 08 мая 2011

Вы должны немного изменить код в классе тупика

   Deadlock() {
    Therad t = new Thread(this); // modified
    t.start();
    System.out.println(); //any instruction to delay
    a.methodA(b);
}

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

0 голосов
/ 24 мая 2010

Через столько времени я могу написать самый простой пример Deadlock. Комментарии приветствуются.

Class A
{
  synchronized void methodA(B b)
  {
    b.last();
  }

  synchronized void last()
  {
    SOP(“ Inside A.last()”);
  }
}

Class B
{
  synchronized void methodB(A a)
  {
    a.last();
  }

  synchronized void last()
  {
    SOP(“ Inside B.last()”);
  }
}


Class Deadlock implements Runnable 
{
  A a = new A(); 
  B b = new B();

  // Constructor
  Deadlock()
  {
    Thread t = new Thread(); 
    t.start();
    a.methodA(b);
  }

  public void run()
  {
    b.methodB(a);
  }

  public static void main(String args[] )
  {
    new Deadlock();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...