gpt4 book ai didi

java - 是否可以使用同步方法编写有保证的经典死锁?

转载 作者:行者123 更新时间:2023-12-02 11:05:34 26 4
gpt4 key购买 nike

在一次面试中,我被要求编写java代码,这肯定会死锁。我编写了每本 Java 书籍中都会介绍的标准代码,例如创建 2 个线程并以不同的顺序调用同步方法,在调用第二个之前先睡一会儿。

当然,这些东西并不能令面试官满意,所以现在我正在着手找出解决方案。

我发现了一段代码:

public class Lock implements Runnable {

static {
System.out.println("Getting ready to greet the world");
try {
Thread t = new Thread(new Lock());
t.start();
t.join();
} catch (InterruptedException ex) {
System.out.println("won't see me");
}
}

public static void main(String[] args) {
System.out.println("Hello World!");
}

public void run() {
try {
Thread t = new Thread(new Lock());
t.start();
t.join();
} catch (InterruptedException ex) {
System.out.println("won't see me");
}
}

}

但我不确定这段代码是否令他们满意?当然。代码永远不会结束执行,但这真的是死锁吗?死锁不是与同步有关吗?并且,例如,我还可以编写一个无限循环,在里面放入一个 Thread.sleep 并将其命名为“死锁”。

所以问题是:是否可以使用同步方法编写一个经典的死锁,但 100% 保证? (请不要告诉我非常非常有可能发生僵局的情况。我知道。)

谢谢。

最佳答案

创建两个资源,并让每个线程在释放另一个资源之前尝试获取一个资源,但顺序不同。例如:

CountDownLatch a = new CountDownLatch (1);
CountDownLatch b = new CountDownLatch (1);

void one() throws InterruptedException {
a.await();
b.countDown();
}

void two() throws InterruptedException {
b.await();
a.countDown();
}

运行one的线程无法释放b,因为它正在等待a。它将永远等待,因为运行 two 的线程无法释放 a,因为它正在等待 b。

一种经典的死锁场景是当您以相反的顺序获取锁时。

关于java - 是否可以使用同步方法编写有保证的经典死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com