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获取对同一方法的锁定。当两个对象都锁定在方法上时到底发生了什么?他们如何阻止对方执行“完成”方法?
答案 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
,它会锁定相关对象的实例。在这种情况下,它会锁定d
或d1
。