gpt4 book ai didi

java代码死锁情况?

转载 作者:太空宇宙 更新时间:2023-11-04 06:07:48 25 4
gpt4 key购买 nike

这是代码

public class TestDeadlockExample1 {
public static void main(String[] args) {
final String resource1 = "xyz";
final String resource2 = "pqr";
// t1 tries to lock resource1 then resource2
Thread t1 = new Thread() {
public void run() {
synchronized (resource1) {
System.out.println("Thread 1: locked resource 1");

try { Thread.sleep(10000);} catch (Exception e) {}

synchronized (resource2) {
System.out.println("Thread 1: locked resource 2");
}
}
}
};

// t2 tries to lock resource2 then resource1
Thread t2 = new Thread() {
public void run() {
synchronized (resource2) {
System.out.println("Thread 2: locked resource 2");

try { Thread.sleep(10000);} catch (Exception e) {}

synchronized (resource1) {
System.out.println("Thread 2: locked resource 1");
}
}
}
};


t1.start();
t2.start();
System.out.println("completed");
}
}


here

t1.start();
t2.start();
System.out.println("completed");

这里

在此 t1.start() 和 t2.start() 是按顺序编写的,所以我怀疑两个线程是否同时启动或者t1启动,执行然后来到t2并执行,如果这是正确的,这如何成为死锁情况..我想知道这些线程的执行

最佳答案

当您启动 Java 程序时,JRE 会生成主线程,并且该主线程会执行您的 main 方法。

当您调用t1.start()时,新线程会生成并执行第一个匿​​名类的run方法。从此时起,您的程序中有 2 个线程同时执行:“主线程”和“线程 1”。

当您调用t2.start()时,另一个线程会生成并执行第二个匿名类的run方法。从此时起,您的程序中有 3 个线程同时执行:“主线程”、“线程 1”、“线程 2”。

线程的执行顺序未定义。它可以是任何东西。一般来说,它们是同时执行的。

您的“线程 1”和“线程 2”分别获取 resource1resource2 上的锁,并 hibernate 10 秒。当发生这种情况时,您的“主”线程完成其执行。但是您的程序中还有 2 个线程,因此虽然 main 方法完成,但程序尚未完成。

hibernate 后,“线程 1”和“线程 2”尝试获取资源 2 和资源 1 上的锁,但这些锁已被获取,因此它们将等待锁持有者释放它。锁持有者永远不会释放它,因为它等待其他资源,因此该程序永远不会停止。这是典型的僵局情况。

关于java代码死锁情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29092754/

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