以下代码在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,这可能导致它永远等待。
  • 10-01 14:53