废话不多说,直接粘测试代码public class Test{
public static void main(String[] args) {
try {
ThreadB tb = new ThreadB();
tb.start();
System.out.println("0");
synchronized (tb) {
System.out.println("3");
tb.wait();
System.out.println("4");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}public class ThreadB extends Thread {
@Override
public void run() {
synchronized (this) {
System.out.println("1");
notify();
System.out.println("2");
}
}
}为什么输出结果有时候是:0123有时候是:01234
2 回答
慕容3067478
TA贡献1773条经验 获得超3个赞
public class Test{ public static void main(String[] args) { try { ThreadB tb =...
桃花长相依
TA贡献1860条经验 获得超8个赞
其实你还少说了一种可能,即:0,3,1,2,4.
对于0,1,2,3来说,首先main线程输出0没有疑问,接下来tb获得对象自身的锁,而main线程在竞争tb对象自身的锁时失败处于阻塞状态,因此执行tb线程的run方法,输出1,调用notify方法,输出2,释放自身对象锁,main线程获得tb对象锁,输出3,调用wait方法,此时存在两种情况:
若nitify方法通知过早,则main线程一直处于wait状态,整个程序不会结束,整个输出为0,1,2,3
若notify方法在main线程调用wait方法之后到达,则输出4,main线程释放对象锁,主程序结束,输出为:0,1,2,3,4
若main线程先获取到tb对象锁,输出3,之后处于wait状态,释放tb对象锁,此时tb线程获取对象锁,输出2,调用notify通知处于wait状态的main线程,输出3之后释放对象锁,此后main得到对象锁,执行wait之后的语句,输出4,
整个输出为0,3,1,2,4.
添加回答
举报
0/150
提交
取消