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获取同一方法上的锁。当两个对象都锁定在方法上时,到底会发生什么?它们是如何阻止对方执行"done“方法的?
发布于 2013-04-26 05:30:47
死锁可能是因为第一个线程正在调用以下代码:
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。
https://stackoverflow.com/questions/16224994
复制相似问题