首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解死锁

理解死锁
EN

Stack Overflow用户
提问于 2017-12-07 13:16:08
回答 1查看 40关注 0票数 0

我正在努力理解如何从https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html中创建一个死锁。

我选择自己编写,而不是复制和粘贴示例代码。

链接的最后一行说:“两个块都不会结束,因为每个线程都在等待另一个线程退出”,但是从来没有提到System.out.format。

然后我编写了下面的代码,它从未进入死锁。

代码语言:javascript
复制
public class DeadlockTest {
  static class Resource {
    public synchronized void test1(Resource r) {
      System.out.print("test1");
      r.test2();
    }
    public synchronized void test2() {
      System.out.print("test2");
    }
  }
  public static void main(String... a) {
    final Resource r1 = new Resource();
    final Resource r2 = new Resource();
    new Thread(new Runnable() {
      public void run() {
        r1.test1(r2);
      }
    }).start();
    new Thread(new Runnable() {
      public void run() {
        r2.test1(r1);
      }
    }).start();
  }
}

所以我试着逐行比较,发现只有打印语句是错误的。我没有使用System.out.format,而是使用了System.out.print。所以代码从来没有进入死锁的情况。然后我将它更改为System.out.format,并能够模拟一个死锁。

我甚至从链接中复制了示例代码,将format语句更改为print/println,它没有进入死锁。

有人能解释一下如何准确地创建一个死锁吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-07 13:32:36

我拿了你的代码来测试它。确实很好。

只有当我在Thread.sleep(100)String.format中添加test1时,它才会阻塞。似乎您的“工作”方法(print)太快了。在第二个线程通过调用test1导致块之前,第一个线程已经用test2完成了。

为了继续学习教程中的例子:您的线程实际上并没有“同时向对方鞠躬()”,而只是“非常快地互相追赶()”。使弯曲稍微慢一点,你增加了他们的机会在同一时间(仍然没有保证,例如,如果系统需要更长的时间来调度第二个线程)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47695991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档