死锁示例

时间:2013-04-25 21:24:50

标签: java multithreading

public class DeadLockExampleTwo {

public static void main(String[] args) {

    final DeadLockExampleTwo d = new DeadLockExampleTwo();
    final DeadLockExampleTwo d1 = new DeadLockExampleTwo();

    new Thread(new Runnable(){
        @Override
        public void run() {
            d.doSomething(d1);
        }
    }).start();

    new Thread(new Runnable(){
        @Override
        public void run() {
            d1.doSomething(d);
        }
    }).start();
}

    public synchronized void doSomething(DeadLockExampleTwo e) {
        System.out.println("Doing "+Thread.currentThread().getName());
        e.done(this);
    }
    public synchronized void done(DeadLockExampleTwo d) {
        System.out.println("Done");
    }
}

上述代码有可能导致死锁。 d来自doSomething方法的第一个线程锁,来自其他线程的d1获取对同一方法的锁定。当两个对象都锁定在方法上时到底发生了什么?他们如何阻止对方执行“完成”方法?

1 个答案:

答案 0 :(得分:3)

死锁可能发生,因为第一个线程正在调用以下内容:

d.doSomething(d1);  // this is a synchronized method so locks on d
d1.done(...);       // this is a synchronized method so it tries to lock d1

当另一个线程可能同时调用:

d1.doSomething(d);  // this locks d1
d.done(...);        // this tries to lock d

我在上面使用“可能”一词,因为有一个race condition。如果它发生,那么两个线程每个都有一个锁,并试图锁定另一个对象。

正如我在your previous question中提到的,如果你只运行一次那么它很可能不会死锁,因为一个线程最有可能在另一个启动之前完成。您将不得不设置一个循环并多次调用它以使其锁定。

如果某个方法有synchronized,它会锁定相关对象的实例。在这种情况下,它会锁定dd1