8/04/2011

Example of Java thread deadlock

A simple example showing a typical Java thread deadlock. 2 threads are spawned: thread-0 first locks lock1 and then lock2; thread-1 first locks lock2 and then lock1. Each thread sleeps a bit before acquiring the second lock, to increase the chance of deadlock.

package test.concurrent;
public class DeadLockTest {
private static long sleepMillis;
private final Object lock1 = new Object();
private final Object lock2 = new Object();

public static void main(String[] args) {
sleepMillis = Long.parseLong(args[0]);
DeadLockTest test = new DeadLockTest();
test.doTest();
}

private void doTest() {
Thread t1 = new Thread(new Runnable() {
public void run() {
lock12();
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
lock21();
}
});
t1.start();
t2.start();
}

private void lock12() {
synchronized (lock1) {
sleep();
synchronized (lock2) {
sleep();
}
}
}

private void lock21() {
synchronized (lock2) {
sleep();
synchronized (lock1) {
sleep();
}
}
}

private void sleep() {
try {
Thread.sleep(sleepMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
To run the deadlock test with sleep time 1 millisecond:
java -cp . test.concurrent.DeadLockTest 1
The process seems to hang for ever. To get the thread dump, press Ctrl-\ (Ctrl-break on Windows). Thread dump contains the following deadlock diagnositc:
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 1017fcfb0 (object 7f31050b0, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 1017fe360 (object 7f31050c0, a java.lang.Object),
which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
at test.concurrent.DeadLockTest.lock21(DeadLockTest.java:44)
- waiting to lock <7f31050b0> (a java.lang.Object)
- locked <7f31050c0> (a java.lang.Object)
at test.concurrent.DeadLockTest.access$1(DeadLockTest.java:40)
at test.concurrent.DeadLockTest$2.run(DeadLockTest.java:23)
at java.lang.Thread.run(Thread.java:680)
"Thread-0":
at test.concurrent.DeadLockTest.lock12(DeadLockTest.java:35)
- waiting to lock <7f31050c0> (a java.lang.Object)
- locked <7f31050b0> (a java.lang.Object)
at test.concurrent.DeadLockTest.access$0(DeadLockTest.java:31)
at test.concurrent.DeadLockTest$1.run(DeadLockTest.java:18)
at java.lang.Thread.run(Thread.java:680)

Found 1 deadlock.

6 comments:

YuanYun.Kenny.CN said...

Perfect example to demonstrate that inconsistent lock order will cause deadlock, and the good part is the test example, and stack trace.

Anonymous said...

What is deadlock in java and how to fix it has
become common interview question , but indeed its important to learn in order to write deadlock free concurrent code.

Pierre-Hugues Charbonneau said...

Good example and sample program showing a Java level deadlock.

Your readers may also be interested in an article describing Java deadlock troubleshooting strategies along with the reference to a very good 2012 JavaOne lab.

Regards,
P-H

Ramesh Swarnkar said...

Unfortunately, I did not get any DeadLock in console.
I can see the thread is executing fine for me.

Anonymous said...

Thanks for the great article...

Also a good one here too with the popular banking example:

java race condition example

Anna said...

Great and Useful Article.

Online Java Training

Online Java Training from India

Online Java Training

Online Java Training From India

Java Training Institutes in Chennai

Java Training in Chennai