gpt4 book ai didi

java - 为什么我陷入僵局

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

我无法理解为什么我在这个简单的示例中陷入僵局。它有什么问题?

public static void main(String[] args) {
Object data = null;
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}

class Producer implements Runnable {
private Object data;

public Producer(Object data) {
this.data = data;
}

@Override
public void run() {
while (true) {
while (data != null) {}
data = new Object();
System.out.println("put");
}
}
}

class Consumer implements Runnable {
private Object data;

public Consumer(Object data) {
this.data = data;
}

@Override
public void run() {
while (true) {
while (data == null) { }
data = null;
System.out.println("get");
}
}

最佳答案

有两个问题。

1:您有两个独立的 Runnable,每个 Runnable 都有自己的私有(private)内部成员,名为 data。对其中一个所做的更改对另一个不可见。如果要在两个线程之间传递数据,则需要将其存储在两个线程都可以访问的公共(public)位置。您还需要同步访问或使引用可变。

2:您的支票似乎被倒置了。您可能想在它不为 null 时将其 null ,并在它为 null 时创建一个?很难说出你想要它实际做什么! :)

public static volatile Object data;

public static void main(String[] args) {
data = null;
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}

class Producer implements Runnable {

public Producer(Object data) {
this.data = data;
}

@Override
public void run() {
while (true) {
while (data == null) {}
data = new Object();
System.out.println("put");
}
}
}

class Consumer implements Runnable {

public Consumer(Object data) {
this.data = data;
}

@Override
public void run() {
while (true) {
while (data != null) { }
data = null;
System.out.println("get");
}
}

(此外,这实际上并不是我们定义的死锁的典型示例,其中两个线程无法继续,因为它们都想要另一个线程拥有的锁。这里没有锁。这是两个线程的示例无限循环,什么也不做。)

关于java - 为什么我陷入僵局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016445/

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