弱问:下面代码为何会产生死锁 死锁发生在: 线程1锁定了res1,而线程2锁定了res2, 这时, 线程1不能获得 res2, 线程2不能获得 res1, 谁都不能获得所需的res可以把线程2改为: 先获得res1, 后锁定res2 ,这样就不会死锁 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 t1锁了s1 sleep, 这时t2运行锁了s2 sleep然后t1醒了找s2,s2在t2上,t1挂起,t2醒了找s1,s1在t1上,两个都得不到第二层的锁 当然就死锁了 当线程1进入同步res1时线程2刚好进入同步res2双发都在等待对方释放锁的对峙情况 谢谢楼上几位,还是有点不明白线程1锁定res1,线程2锁定res2,然后各自sleep,1秒后分别醒来,这时各自需要的资源都应该没有线程锁定才对啊?我的理解错在哪里 锁的意思是:会在锁定处等待该资源被释放,代码是不会继续执行的。而且sleep时,不会释放资源。上述线程1锁定res1范围是if语句段,即只有执行完if才会释放res1。 线程2锁定res2范围是else语句段,只有执行完else才会释放res2。但在if中,接着又要使用res2,此时res2已被同步,即被锁住,代码等待res2的释放。同理,发生在else中。造成死锁。 线程1锁定res1,线程2锁定res2,然后各自sleep,1秒后分别醒来,但是如下你的程序所示的,当线程1醒来的时候它并没有释放掉锁定的res1,看synchronized(res1) 这个块的作用范围内还在锁定中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."); } } 求动态行转列算法 java有没有清除当前输出的方法? 急啊 [求助]2个关于流的问题 有关JDBC连接sql2000 的奇怪问题??? 求:一道软件测试面试题 请问什么是构造函数 java程序员面试中的多线程问题 大家帮忙解答一下面试JAVA程序员时的题目,进来看看了, 多谢了!!!!!!! api 问几个基础问题 谢谢~ 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.");
}
}