gpt4 book ai didi

Java:多线程同步,导致死锁

转载 作者:行者123 更新时间:2023-11-30 06:22:13 25 4
gpt4 key购买 nike

我正在尝试创建两个线程 OddThreadEvenThread 分别打印奇数和偶数。我尝试同步这两个线程以打印自然数。

它工作正常,但我不知道为什么一段时间后它会陷入僵局。

我的代码是这样的:

public class NaturalNoPrint {
public static void main(String[] args) {
Object lock = new Object();
Thread oddThread = new Thread(new OddThread(lock));
Thread evenThread = new Thread(new EvenThread(lock));
oddThread.start();
evenThread.start();
}
}

class OddThread implements Runnable{
private int no=1;
private Object lock;

OddThread(Object lock){
this.lock=lock;
}
public void run(){
while(true){
synchronized(lock){
try {
lock.wait();
System.out.println(no);
no+=2;
lock.notify();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

class EvenThread implements Runnable{
private int no=2;
private Object lock;

EvenThread(Object lock){
this.lock=lock;
}
public void run(){
while(true){
synchronized(lock){
try{
lock.notify();
lock.wait();
System.out.println(no);
no+=2;
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}

请帮助确定死锁的原因。

最佳答案

你有一个竞争条件。

如果调度程序首先调度EvenThread,它会在lock 上同步并立即调用notify,释放监视器。 OddThread 然后获取 lock 监视器并调用 wait() 释放监视器但不通知 EvenThread。两个线程现在都在等待一个永远不会到来的notify

这可能在执行期间的任何时候发生,并且取决于 Thread 调度程序。

关于Java:多线程同步,导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612239/

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