死锁发生在: 线程1锁定了res1,而线程2锁定了res2, 这
时, 线程1不能获得 res2, 线程2不能获得 res1, 谁都不能获得所需的res可以把线程2改为: 先获得res1, 后锁定res2 ,这样就不会死锁
时, 线程1不能获得 res2, 线程2不能获得 res1, 谁都不能获得所需的res可以把线程2改为: 先获得res1, 后锁定res2 ,这样就不会死锁
解决方案 »
- 谁帮我设置下java.我的eclipse 就是用不成。一打开就错误。
- 几道面试题
- 求 数据结构
- MidiSystem.getSequencer(false/true) 的作用
- 不知道为了什么?这个问题总缠绕着我?
- 关于事件适配器的简单问题。急。。
- 在JAVA可不可以做到像QQ的那个可以选择那个gif格式的小图片的类!???
- 【100分求解!】兄弟们来看看
- DefaultMutableTreeNode 要用到什么包啊?
- Exception in thread "main" java.lang.NoClassDefFoundError: xunhuan
- 问几个基础问题 谢谢~
- jacob 画红线,帮我解决,我给200分。
然后t1醒了找s2,s2在t2上,t1挂起,
t2醒了找s1,s1在t1上,两个都得不到第二层的锁 当然就死锁了
线程2刚好进入同步res2
双发都在等待对方释放锁的对峙情况
线程1锁定res1,线程2锁定res2,然后各自sleep,1秒后分别醒来,这时各自需要的资源都应该没有线程锁定才对啊?
我的理解错在哪里
会在锁定处等待该资源被释放,代码是不会继续执行的。
而且sleep时,不会释放资源。上述线程1锁定res1范围是if语句段,即只有执行完if才会释放res1。
线程2锁定res2范围是else语句段,只有执行完else才会释放res2。但在if中,接着又要使用res2,此时res2已被同步,即被锁住,代码等待res2的释放。
同理,发生在else中。造成死锁。
synchronized(res1) ...{
System.out.println("Resource 1 is locked. Waiting for Resource 2.");
try ...{
Thread.sleep(1000);
}
catch (InterruptedException e) ...{}
/**//* 锁定资源res2 */
synchronized(res2) ...{
System.out.println("Complete.");
}
}