以下代码在SCJP6书中
class ThreadA {
public static void main(String [] args) {
ThreadB b = new ThreadB();
b.start();
synchronized(b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total;
public void run() {
synchronized(this) {
for(int i=0;i<100;i++) {
total += i;
}
notify();
}
}
}
前面的代码会不会导致死锁,因为线程a和b都对b进行了锁定(在相应的同步块(synchronized block)中)?
我错过了一些东西,但不太确定它是什么。
最佳答案
这取决于。
从wait方法的文档中-
因此,如果您考虑两种情况-
ThreadA
首先获得对对象b
的锁定,它将等待,导致锁定释放,这将导致ThreadB
继续其工作。 ThreadB
首先获得了锁,那么它将继续工作,释放锁,然后ThreadA
将开始。接下来,ThreadA
将等待对象锁定b
,这可能导致它永远等待。