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上锁定(在相应的同步块中)?
我错过了什么,但不太确定它是什么.
最有可能的执行如下:
b.start()和run正在执行的方法之间有一点延迟b并进入synchronized块b(释放锁定)run开始执行时,监视器可用(或将很快可用),以便它可以进入synchronized块b它可以停止等待但是,根据线程调度,run首先执行并不是不可能的,在这种情况下,主线程可以永远等待b.wait().例如,如果您通过Thread.sleep(100)在之后插入一个小的帮助来帮助这种情况b.start(),您应该观察到这种行为.
一句话:它是一个可能遇到活动问题的臭代码(因为锁可用,它本身并不是死锁).