gpt4 book ai didi

java - 死锁示例

转载 作者:行者123 更新时间:2023-12-01 23:51:46 25 4
gpt4 key购买 nike

public class DeadLockExampleTwo {

public static void main(String[] args) {

final DeadLockExampleTwo d = new DeadLockExampleTwo();
final DeadLockExampleTwo d1 = new DeadLockExampleTwo();

new Thread(new Runnable(){
@Override
public void run() {
d.doSomething(d1);
}
}).start();

new Thread(new Runnable(){
@Override
public void run() {
d1.doSomething(d);
}
}).start();
}

public synchronized void doSomething(DeadLockExampleTwo e) {
System.out.println("Doing "+Thread.currentThread().getName());
e.done(this);
}
public synchronized void done(DeadLockExampleTwo d) {
System.out.println("Done");
}
}

上面的代码有可能导致死锁。 d 来自第一个线程锁定 doSomething 方法,来自其他线程的 d1 获取同一方法上的锁定。当两个对象都锁定该方法时到底会发生什么?他们如何阻止对方执行“done”方法?

最佳答案

死锁可能发生,因为第一个线程正在调用以下内容:

d.doSomething(d1);  // this is a synchronized method so locks on d
d1.done(...); // this is a synchronized method so it tries to lock d1

而另一个线程可能同时调用:

d1.doSomething(d);  // this locks d1
d.done(...); // this tries to lock d

我在上面使用“可能”这个词是因为有一个 race condition 。如果发生这种情况,则两个线程各自拥有一个锁,并尝试获取另一个对象上的锁。

正如我在 your previous question 中提到的,如果您只运行一次,那么它很可能不会死锁,因为一个线程很可能会在另一个线程启动之前完成。您必须设置一个循环并多次调用它才能锁定。

当您对某个方法进行同步时,它会锁定相关对象的实例。在本例中,它锁定 dd1

关于java - 死锁示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224994/

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