从SCJP 6书中了解多线程

Che*_*min 3 java multithreading

以下代码在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();
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)

先前的代码不会导致死锁,因为线程a和b都在b上锁定(在相应的同步块中)?

我错过了什么,但不太确定它是什么.

ass*_*ias 6

最有可能的执行如下:

  • b.start()run正在执行的方法之间有一点延迟
  • 因此,主线程设法获取锁定b并进入synchronized
  • 它然后等待b(释放锁定)
  • run开始执行时,监视器可用(或将很快可用),以便它可以进入synchronized
  • 当它完成时,它会通知b它可以停止等待
  • 主线程完成.

但是,根据线程调度,run首先执行并不是不可能的,在这种情况下,主线程可以永远等待b.wait().例如,如果您通过Thread.sleep(100)在之后插入一个小的帮助来帮助这种情况b.start(),您应该观察到这种行为.

一句话:它是一个可能遇到活动问题的臭代码(因为锁可用,它本身并不是死锁).