// deadlock sample class, // illustrates a thread deadlock public class deadlock implements Runnable { private final Object resource1_; private final Object resource2_; private final String messageIn_; private final String messageOut_; // program entry point public static void main(String[] args) { boolean order = false; if (args != null && args.length>= 1 && args[0].equals("order")) { order = true; } final Object resource1 = new Object(); final Object resource2 = new Object(); // create sample runners and start them (new Thread(new deadlock(resource1, resource2, "+", "-"))).start(); // second possibly in oposite order; different markers (new Thread(new deadlock( (order ? resource1 : resource2), (order ? resource2 : resource1), "*", "/"))).start(); // suspend main thread synchronized (deadlock.class) { try { deadlock.class.wait(); } catch (InterruptedException ignored) { } } } public deadlock(Object resource1, Object resource2, String messageIn, String messageOut) { resource1_ = resource1; resource2_ = resource2; messageIn_ = messageIn; messageOut_ = messageOut; } public void run() { for (;;) { // acquire #1 print(messageIn_); synchronized (resource1_) { // acquire #2 print(messageIn_); synchronized (resource2_) { print(messageOut_); } print(messageOut_); } } } private static void print(String s) { synchronized (System.out) { System.out.print(s); System.out.flush(); } } } /* "Thread-1" prio=1 tid=0xa86160d8 nid=0x2a9f waiting for monitor entry [0xa8366000..0xa8366ed0] at deadlock.run(deadlock.java:59) - waiting to lock <0xa8a8dc50> (a java.lang.Object) - locked <0xa8a8dc58> (a java.lang.Object) at java.lang.Thread.run(Thread.java:595) "Thread-0" prio=1 tid=0xa8615b20 nid=0x2a9e waiting for monitor entry [0xa83e8000..0xa83e8150] at deadlock.run(deadlock.java:59) - waiting to lock <0xa8a8dc58> (a java.lang.Object) - locked <0xa8a8dc50> (a java.lang.Object) at java.lang.Thread.run(Thread.java:595) Found one Java-level deadlock: ============================= "Thread-1": waiting to lock monitor 0x080b92a4 (object 0xa8a8dc50, a java.lang.Object), which is held by "Thread-0" "Thread-0": waiting to lock monitor 0x080b9264 (object 0xa8a8dc58, a java.lang.Object), which is held by "Thread-1" */