0
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 获得相同方法的锁定。当两个对象都锁定该方法时,究竟会发生什么?他们如何阻止对方执行“完成”方法?

4

1 回答 1

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

我使用上面的“可能”一词是因为存在竞争条件。如果发生这种情况,则两个线程各有一个锁,并试图获得另一个对象的锁。

正如我在上一个问题中提到的那样,如果您只运行一次,那么它很可能不会死锁,因为一个线程很可能会在另一个线程开始之前完成。您必须设置一个循环并多次调用它以使其锁定。

当您synchronized使用方法时,它会锁定相关对象的实例。在这种情况下,它正在锁定dd1

于 2013-04-25T21:30:46.670 回答