java - Java多线程死锁或饥饿?
问题描述
我正在为我的 OCP 考试学习,并试图理解我们何时谈论线程死锁或线程处于饥饿状态。如果出现以下情况,我有疑问。
public class ThreadTest {
private static int i = 0;
public static void doSomething() {
synchronized(ThreadTest.class) {
while(true) {
System.out.println("count:" + ++i)
} }
}
public static void main(String args[]) {
New Thread(() -> doSomething()).start();
New Thread(() -> doSomething()).start();
}}
在 doSomething() 中获取同步 ThreadTest 类的锁的第一个线程进入无限循环,永远不会释放锁。第二个线程一直等待直到资源可用(永远不会发生)。
我们是在说这种情况下的死锁还是饥饿?我想到了饥饿,因为一个线程无法访问共享资源,并且死锁线程会阻塞其他资源。但为了确保我在这里问这个问题。
死锁描述了线程被永远阻塞的情况。
饥饿描述了线程无法定期访问共享资源的情况。
解决方案
正如评论中指出的那样。当以下 4 种情况发生时,就会发生死锁。他们是:
- 互斥 - B 想要 A 拥有的资源。B 不能使用 A 正在使用的资源(这发生在这里)。
- 持有并等待 - A 持有 B 想要的资源。A 也在等待其他人拥有的资源被释放(从给出的探测语句中 A 没有发生)
- 无抢占 - A 持有的资源不能被强行从它手中夺走(假设这里是真的,因为没有给出其他明智的选择)。
- 循环等待 - A 持有 B 想要的资源。B 持有 A 想要的资源(此处未发生)。
因此,我们在这里看到所有条件都没有得到满足。所以在这种情况下不可能存在死锁。
然而,有一个无限循环,因此 A 永远不会放弃锁定。因此 B 会饿死。
这应该可以消除您的疑问。干杯
推荐阅读
- xamarin.forms - SignaturePad 不接受直接设置笔画
- c# - 具有命名参数模板的自动完成功能,用于编码方便和准确
- python - 按嵌套键对字典进行排序
- ubuntu-18.04 - 错误:无法预加载 LD_PRELOAD:忽略
- python-3.x - 无需替换原始文件即可启用多次下载 Chrome Headless Selenium Python
- java - 如何使用 PdfBox 删除可选内容组 (OCG)
- python - 在逻辑函数的 MLE 估计中,在牛顿拉夫森的实现中反复出现“奇异矩阵”的错误
- r - 如何将未定义数量的ggplot项目放入网格中
- java - 将 Collection 与 ReplyingKafkaTemplate 一起使用时,相关 ID 丢失
- python-3.x - 如何为大量文本创建字典并列出最常用的单词?