JAVA线程问题,为什么死锁了?

时间:536次浏览2019.05.15提问

JAVA线程问题,为什么死锁了?

已解决问题

hao231知道平台可亲可爱的夜网友在536次浏览2019.05.15提问提了关于IT技术编程Java相关的问题,他的提问这种JAVA线程问题,为什么死锁了?IT技术编程Java希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,感谢你,我会记得你对我的好的 !

第1个回答

九千万少女的梦2019.05.16回答首先分开看,线程1进去的时候,同步代码锁住,然后cout++后打印输出,在唤醒睡眠的线程,在将自己暂停.这是线程1执行的过程但是你忽略了一个问题,线程1进去的时候,线程2是没拿到锁的,所以进不去方法,线程1执行完后才获得到了锁,线程2进去的时候直接将自己暂停了,而线程1的唤醒早就已经唤醒过了.所以此时的状态是线程1等待,线程2也是等待状态.线程2的代码只要修改一部分就可以完成,即先打印,然后唤醒,再等待即可.你的思路大概的流程如下图所示,你看了应该会明白

第2个回答

随风2019.05.16回答提问者采纳两种改动方式:1)、两个地方需要改1、保证线程2先启动2、线程2的print和notify方法不要放在catch块中,放在try块中obj.wait()语句后面。一般情况下wait()方法并不会抛出异常。此时流程:线程2获取锁、打印、休眠、线程1获取锁、打印、唤醒(线程2)、休眠、线程2被唤醒、打印、唤醒(线程1)、休眠2)、改动一个地方1、线程2的print和notify方法不要放在catch块中,放在try块中obj.wait()语句前面。一般情况下wait()方法并不会抛出异常。synchronized(obj){for(chari='A';i<='Z';i++){try{System.out.println(i);obj.notify();obj.wait();}catch(InterruptedExceptione){e.printStackTrace();}}}此时流程:线程1获取锁、打印、唤醒(没有休眠进程)、沉睡、线程2获取锁、打印、唤醒(线程1)、休眠。。。