📜 ⬆️ ⬇️

DeadLock report in running application

Hello to you!
In this article, or rather an example, I want to show how you can get information about the locked threads of your multi-threaded java application. An example of DeadLock's simplest setting, as well as ways to obtain information about it will be presented under the cut.

The simplest way to get DeadLoack is when one thread tries to lock a resource already locked with another.
public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  1. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  2. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  3. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  4. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  5. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  6. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  7. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  8. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  9. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  10. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  11. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  12. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  13. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  14. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  15. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  16. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  17. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  18. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  19. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  20. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  21. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  22. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  23. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  24. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  25. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  26. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  27. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  28. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  29. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  30. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  31. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  32. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  33. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  34. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  35. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  36. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  37. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  38. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  39. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  40. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  41. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  42. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  43. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
  44. public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .
public class TestDeadLockTracker { public static void main( String [] args) { final Object lock1 = new Object(); final Object lock2 = new Object(); Thread t1 = new Thread( "Deadlock Test T1" ) { public void run() { synchronized (lock1) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock2) { try { Thread.sleep(30L); } catch (Throwable ignored) { } lock2.notify(); } lock1.notify(); } } }; Thread t2 = new Thread( "Deadlock Test T2" ) { public void run() { synchronized (lock2) { try { Thread.sleep(150L); } catch (Throwable ignored) { } synchronized (lock1) { try { Thread.sleep(300L); } catch (Throwable ignored) { } lock1.notify(); } lock2.notify(); } } }; t1.start(); t2.start(); } } * This source code was highlighted with Source Code Highlighter .

In this example, both streams will be locked tightly among themselves on resources lock1 and lock2.
Exit from the program will never happen. Starting with java 1.5, it is very easy to catch such sittuatsii, for this there is a specialized bin for interaction with the ThreadMXBean thread subsystem . Javadoc is quite detailed so read.
Let's write the simplest method to get a report on our problems with locking.
  1. public static String reportDeadlocks ( ArrayList <Long> knownDeadlocks) {
  2. long [] threads = threadMXBean.findDeadlockedThreads ();
  3. if ((threads == null ) || (threads.length == 0)) {
  4. return null ;
  5. }
  6. final ArrayList <Long> dumpIDs = new ArrayList <Long> (threads.length);
  7. for ( long thread: threads) {
  8. boolean found = false ;
  9. if (knownDeadlocks! = null ) {
  10. Iterator itr = knownDeadlocks.iterator ();
  11. while ((! found) && (itr.hasNext ())) {
  12. found = thread == ((Number) itr.next ()). longValue ();
  13. }
  14. }
  15. if (found) continue ;
  16. dumpIDs.add (thread);
  17. }
  18. if (dumpIDs.size () == 0) return null ;
  19. if (knownDeadlocks! = null ) knownDeadlocks.addAll (dumpIDs);
  20. ThreadDumpFilter filter = new ThreadDumpFilter () {
  21. public boolean include (Thread t) {
  22. long id = t.getId ();
  23. for (Long dumpID: dumpIDs) {
  24. if (dumpID == id) return true ;
  25. }
  26. return false ;
  27. }
  28. public String toString () {
  29. return String .format ( "Deadlocked threads:% s" , dumpIDs);
  30. }
  31. };
  32. StringWriter writer = new StringWriter ();
  33. ThreadDump.print ( new PrintWriter (writer), filter);
  34. writer.flush ();
  35. return String .format ( "Found% d new deadlocked threads (% d total deadlocked): \ n% s" ,
  36. dumpIDs.size (), threads.length, writer.toString ());
  37. }
* This source code was highlighted with Source Code Highlighter .

The threadMXBean variable contains the ThreadMXBean instance of the bean. In the second line of the code, we get a list of thread identifiers that have problems with locking. Then we use the auxiliary class ThreadDump (available in the source) to display information about our problem threads. Now we need a separate thread to collect information about the problems in our application. Its code is very simple:
  1. private static class DeadlockTrackerThread extends Thread {
  2. private volatile boolean checking = true ;
  3. DeadlockTrackerThread () {
  4. super ( "Deadlock Tracking Thread" );
  5. setPriority (1);
  6. setDaemon ( true );
  7. }
  8. public void setChecking (boolean b) {
  9. this .checking = b;
  10. if ( this .checking) return ;
  11. interrupt ();
  12. }
  13. public void run () {
  14. ArrayList <Long> knownDeadlocks = new ArrayList <Long> ();
  15. try {
  16. while ( this .checking) {
  17. String report = ThreadUtils.reportDeadlocks (knownDeadlocks);
  18. if (report! = null ) {
  19. System. out .print ( "Dedlock detected" + report);
  20. }
  21. try {
  22. Thread.sleep (6000L);
  23. } catch (InterruptedException intx) {}
  24. }
  25. } catch (Exception e) {
  26. System.err.print ( "Error:" + e.getMessage ());
  27. }
  28. }
  29. }
* This source code was highlighted with Source Code Highlighter .

He checks for a problem report every 6 seconds, and if so, then displays it in System.out.

Now add a couple of lines of code to our first program, to check that this bunch of code works:
  1. public class TestDeadLockTracker {
  2. public static void main ( String [] args) {
  3. if (! ThreadUtils.isDeadlockDetectionSupported ()) {
  4. System. out .println ( "DeadlockDetection not supported" );
  5. return ;
  6. }
  7. ThreadUtils.setDeadlockDetectionEnabled ( true );
  8. ThreadUtils.setTrackingDeadlocksEnabled ( true );
  9. final Object lock1 = new Object ();
  10. ....
  11. }
  12. }
* This source code was highlighted with Source Code Highlighter .

We start and, in the console of our program, we will see approximately the following lines:
Dedlock detected Found 2 new deadlocked threads (2 total deadlocked):
- Thread Dump Deadlocked threads: [11, 10]
Thread [Deadlock Test T1,5, main] "Deadlock Test T1" Id = 10 BLOCKED on java.lang.Object@272d7a10 owned by "Deadlock Test T2" Id = 11
')
TestDeadLockTracker $ 1.run (TestDeadLockTracker.java:27)
Thread [Deadlock Test T2,5, main] "Deadlock Test T2" Id = 11 BLOCKED on java.lang.Object@1aa8c488 owned by "Deadlock Test T1" Id = 10

TestDeadLockTracker $ 2.run (TestDeadLockTracker.java:45)
- End Thread Dump

Sources
Thanks for attention.

Source: https://habr.com/ru/post/89690/


All Articles