我正在努力理解如何从https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html中创建一个死锁。
我选择自己编写,而不是复制和粘贴示例代码。
链接的最后一行说:“两个块都不会结束,因为每个线程都在等待另一个线程退出”,但是从来没有提到System.out.format。
然后我编写了下面的代码,它从未进入死锁。
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,它没有进入死锁。
有人能解释一下如何准确地创建一个死锁吗?
发布于 2017-12-07 13:32:36
我拿了你的代码来测试它。确实很好。
只有当我在Thread.sleep(100)或String.format中添加test1时,它才会阻塞。似乎您的“工作”方法(print)太快了。在第二个线程通过调用test1导致块之前,第一个线程已经用test2完成了。
为了继续学习教程中的例子:您的线程实际上并没有“同时向对方鞠躬()”,而只是“非常快地互相追赶()”。使弯曲稍微慢一点,你增加了他们的机会在同一时间(仍然没有保证,例如,如果系统需要更长的时间来调度第二个线程)。
https://stackoverflow.com/questions/47695991
复制相似问题