gpt4 book ai didi

java - 死锁——这个程序能死锁吗?

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

这段代码有没有可能发生死锁?

我运行了很多次都没有,但是任务要求解释是否可能出现死锁情况。

public class DeadlockTest {
public static void main(String[] args) {
ReentrantLock[] locks = new ReentrantLock[3];
for (int i = 0; i < 3; i++) {
locks[i] = new ReentrantLock();
}
WorkerThread[] threads = new WorkerThread[3];
for (int i = 0; i < 3; i++) {
threads[i] = new WorkerThread(locks[i], locks[(i+1)%3]);
threads[i].start();
}
}
}

class WorkerThread extends Thread {
private ReentrantLock l1;
private ReentrantLock l2;
public WorkerThread(ReentrantLock l1, ReentrantLock l2) {
this.l1 = l1;
this.l2 = l2;
}
public void run() {
l1.lock();
l2.lock();
System.out.println("Working now.");
l1.unlock();
l2.unlock();
}
}

最佳答案

这里肯定有死锁的可能:

  • 线程 0 将按顺序尝试持有锁 0 和 1;
  • 线程 1 将按顺序尝试并持有锁 1 和 2;
  • 线程 2 将按顺序尝试并持有锁 2 和 0。

回想一下,即使在代码中您安排线程“一个接一个”地运行,底层调度程序可能会选择其他方式。此外,并不是因为线程当前正在执行,所以它的所有代码都已执行。

这种情况是可能的:

  • 线程1持有锁1;
  • 线程2持有锁2;
  • 线程 1 尝试并持有锁 2:它不能 --> 线程被阻塞;
  • 线程 0 持有锁 0;
  • 线程 2 尝试并持有锁 0:它不能 --> 线程被阻塞;
  • 线程 0 尝试并持有锁 1:它不能 --> 线程被阻塞。

僵局!

关于java - 死锁——这个程序能死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453081/

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