[童虎退殻シリーズ]デッドロックデモ
2075 ワード
package creative.fire.multithread;
/**
* @author [email protected] 2011-10-13
*
*/
public class DeadLockTest extends Thread {
private final int timeout1 = 2 * 1000;
private final int timeout2 = 4 * 1000;
private static Object o1 = new Object();
private static Object o2 = new Object();
public void a(String name) throws InterruptedException {
synchronized (o1) {
System.out.println(name + " lock o1");
Thread.sleep(timeout1);
System.out.println(name + " try to lock o2...");
synchronized (o2) {
System.out.println(name + " lock o2");
}
System.out.println(name + " unlock o2");
}
System.out.println(name + " unlock o1");
}
public synchronized void b(String name) throws InterruptedException {
synchronized (o2) {
System.out.println(name + " lock o2");
Thread.sleep(timeout2);
System.out.println(name + " try to lock o1...");
synchronized (o1) {
System.out.println(name + " lock o1");
}
System.out.println(name + " unlock o1");
}
System.out.println(name + " unlock o2");
}
public static void main(String[] args) {
final DeadLockTest thiz1 = new DeadLockTest();
final DeadLockTest thiz2 = new DeadLockTest();
new Thread(new Runnable() {
@Override
public void run() {
try {
thiz1.a("1");
thiz1.b("1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
thiz2.b("2");
thiz2.a("2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}