没有循环的死锁
回答
号考虑:
private static final Semaphore foo = new Semaphore(1);
private static final Semaphore bar = new Semaphore(1);
private static void one() throws InterruptedException {
foo.acquire();
bar.acquire();
bar.release();
foo.release();
}
private static void two() throws InterruptedException {
bar.acquire();
foo.acquire();
foo.release();
bar.release();
}
为可运行例如参见http://pastebin.com/QfK5ZByj。它对我来说很快就会陷入僵局。
一些方法可能会阻塞。这适用于包java.util.concurrent
中的许多方法。您还应该考虑方法内的块。
如果仅考虑同步方法,则可以在方法调用中没有循环的情况下产生死锁,因为同步方法将对象实例用作监视器。例如,如果您有两个对象A和B,每个对象具有同步方法1()和2()。如果A.1()调用B.1()和B.2()调用A.2(),虽然方法中没有循环,但如果一个线程同时调用B.2()
而另一个调用A.1()
,那么有一个僵局风险。
好吧我想我解释错了。如果一个班级另一个班级打电话,我正在谈论绘制一个尖箭头。所以箭头在课堂级别而不是方法级别。但是如果使用同步类,我只考虑绘制箭头。你懂我的意思吗? :-) – 2011-04-01 10:00:58
不,这还不够。假设你必须有线程:A和B.调用对象o1的方法m1,它调用对象o2的方法m1。线程B调用对象o2的方法m2,该方法调用对象o1的方法m2。假设所有的方法都是同步的。现在,A和B的并发执行会导致死锁。虽然方法之间没有循环调用关系。
是功课吗?
即使您对关于类的编辑还不够,因为您可以通过非同步方法调用来关闭循环。
有趣的是,如果您绘制的是对象而不是方法的图形,则存在一个循环:o1 - > o2 - > o1。这是否适用于所有不涉及等待/通知的死锁情况?尽管如此,这可能不是一种让你在练习中非常有效的方法。 – 2011-04-01 10:30:31
看看我编辑过的picutre,它显示了tom描述的内容。我只在对象级别上讨论连接。我的第一个描述是错误的... – 2011-04-01 11:28:20
@Franz Kafka:看,我的答案的最后一句。 – jmg 2011-04-01 11:34:11
- 1. 循环调度和死锁
- 2. pthread_cond_wait fifo循环队列中的死锁
- 3. 并行循环上的死锁
- 4. 死锁没有到达keyPressedEvent()
- 5. 死锁没有用户代码
- 6. 这段代码怎么没有死锁?
- 7. 循环枚举的PLINQ迭代导致死锁
- 8. .htaccess重定向 - 没有[R]标志的死循环
- 9. C中的死循环
- 10. Postgresql锁死锁
- 11. 带有ReadUncommitted的死锁?
- 12. 使用OpenMP和Eigen导致无限循环/死锁
- 13. SQL Server 2008:发生死锁...没有任何锁
- 14. 没有for循环
- 15. 我有一个死锁同步,请大家帮忙启动循环周期
- 16. 死循环返回错误
- 17. 如何杀死while循环?
- 18. 打破死循环芹菜
- 19. Autoit死循环问题
- 20. NHibernate的死锁
- 21. 死锁锁()方法
- 22. 锁分区死锁
- 23. 避免死锁和防止死锁有什么区别?
- 24. Mysql所有死锁日志
- 25. 没有索引的存储过程常见的死锁
- 26. Goroutines被for循环封锁?
- 27. 循环可以自锁吗?
- 28. 有没有什么办法通过OnClick按钮来杀死setInterval循环
- 29. 奇怪的死锁(?)
- 30. LinkedBlockingQueue中的死锁(?)
好吧,这很有趣。如果箭头是线条(指向两个方向),那么它将是一个循环。单向箭头不是一个循环。 – 2011-04-01 11:35:54