gpt4 book ai didi

java - 这段代码怎么会导致死锁呢?

转载 作者:行者123 更新时间:2023-12-01 06:35:48 26 4
gpt4 key购买 nike

在通过 SCJP6 考试模拟器时,我发现了这样的问题:

class Clerk implements Runnable {

private Record A, B;

public Clerk(Record a, Record b) {
A = a;
B = b;
}

public void run() {
while(true) {
doStuff(A, B);
}
}

public synchronized void doStuff(Record a, Record b) {
synchronized(a) {
synchronized(b) {
a.add(1);
b.add(-1);
}}
}

}

然后

Record a = new Record();
Record b = new Record();

new Thread(new Clerk(a, b)).start();
new Thread(new Clerk(a, b)).start();

答案说这段代码可能导致死锁,但我不明白 - 这到底是怎么可能的?有人可以帮我解决这个问题吗?

最佳答案

除了无法编译之外,该代码中不存在死锁。这段代码肯定会造成死锁:

new Thread(new Clerk(a, b)).start();
new Thread(new Clerk(b, a)).start();

那么如果问题是:Clerk 类可能是死锁的根源吗?那么答案是肯定的。

编辑

简短的例子,应该很快就会死锁。如果像原问题一样使用 a 和 b,则程序运行良好。

public class Test1 {

public static void main(String[] args) {
Record a = new Record();
Record b = new Record();

new Thread(new Clerk(a, b)).start();
new Thread(new Clerk(b, a)).start();
}

static class Record {
}

static class Clerk implements Runnable {

private Record A, B;

public Clerk(Record a, Record b) {
A = a;
B = b;
}

public void run() {
while (true) {
System.out.println("in thread " + Thread.currentThread());
for (int i = 0; i < 10000; i++) {
doStuff(A, B);
}
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
}
}

public synchronized void doStuff(Record a, Record b) {
synchronized (a) {
synchronized (b) {
}
}
}
}
}

关于java - 这段代码怎么会导致死锁呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822890/

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