为了账号安全,请及时绑定邮箱和手机立即绑定

Java多线程synchronized、wait和notify问题

Java多线程synchronized、wait和notify问题

aluckdog 2018-07-17 10:14:57
废话不多说,直接粘测试代码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 =...


查看完整回答
反对 回复 2018-08-08
?
桃花长相依

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.


查看完整回答
反对 回复 2018-08-08
  • 2 回答
  • 0 关注
  • 781 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信