gpt4 book ai didi

java - 通过一个简单的例子理解死锁

转载 作者:行者123 更新时间:2023-11-29 07:25:07 24 4
gpt4 key购买 nike

我正在努力了解死锁基础知识,因此我想出了以下代码。我有两个线程以相反的顺序获取锁,但它们没有死锁。当我运行它时,我会看到所有的打印输出。我做错了什么?

public class DeadlockBasics {
private Lock lockA = new ReentrantLock();
private Lock lockB = new ReentrantLock();

public static void main(String[] args) {
DeadlockBasics dk = new DeadlockBasics();
dk.execute();
}

private void execute() {
new Thread(this::processThis).start();
new Thread(this::processThat).start();
}

// called by thread 1
public void processThis() {
lockA.lock();
// process resource A
System.out.println("resource A -Thread1");

lockB.lock();
// process resource B
System.out.println("resource B -Thread1");

lockA.unlock();
lockB.unlock();
}

// called by thread 2
public void processThat() {
lockB.lock();
// process resource B
System.out.println("resource B -Thread2");

lockA.lock();
// process resource A
System.out.println("resource A -Thread2");

lockA.unlock();
lockB.unlock();
}
}

最佳答案

首先,没有保证哪个线程先启动。要获得死锁,其中一个线程必须锁定 lockA,然后第二个线程必须锁定 lockB,反之亦然。

public void processThis() {
lockA.lock();
// here the control should be switched to another thread
System.out.println("resource A -Thread1");

lockB.lock();
...

但是可能没有足够的时间在线程之间切换,因为你只有几行代码。它太快了。为了模拟一些长时间的工作,在两种方法的第二次锁定之前添加延迟

lockA.lock();
Thread.sleep(200); // 200 milis

然后第二个线程将能够在第一个释放之前锁定lockB

关于java - 通过一个简单的例子理解死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54753779/

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