我正在尝试Java多线程中的死锁概念。我碰到一个代码段这有可能导致死锁传来:当我运行它时,为什么这个代码永远不会死锁?
public class Deadlock {
double amount = 10.0;
public double deposit(double d) {
amount += d;
return amount;
}
public double withdraw(double d) {
amount -= d;
return amount;
}
public static void transfer(Deadlock from, Deadlock to,double d) {
synchronized(from) {
synchronized(to) {
from.withdraw(d);
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(5000);
}catch(Exception e){}
to.deposit(d);
System.out.println("Done");
}
}
}
public static void main(String[] args) {
final Deadlock a = new Deadlock();
final Deadlock b = new Deadlock();
Thread t1 = new Thread(new Runnable() {
public void run() {
transfer(a, b, 10.0);
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
transfer(b, a, 10.0);
}
});
t2.start();
}
}
基本上,代码试图在同一时间获得关于对象A和B的锁。但是,当我运行它时,代码总是成功完成。为什么不是这个僵局?
它并不会因为运气好而死锁。 (在这种情况下,你可能很幸运,因为你正在快速连续获取锁具。) –