这段java 多线程代码为啥id是1的线程一直在等待?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这段java 多线程代码为啥id是1的线程一直在等待?相关的知识,希望对你有一定的参考价值。

public class X_3_solution extends Thread
static Object o = new Object();
static int counter = 0;
int id ;
public X_3_solution(int id)
this.id = id;
o = new Object();

public void run()
if(id == 0)
new X_3_solution(1).start();
trysleep(100);catch (Exception e)
new X_3_solution(2).start();
return;

synchronized(o)
System.err.print(id + " --->");
try
if(counter == 0)
counter = 1;
o.wait();
else o.notifyAll();
catch (InterruptedException e)

System.err.println(id +" <---");


public static void main(String[] args)
new X_3_solution(0).start();



输出是 1 --->2 --->2 <---,
一直不输出 1 <---

从代码来看,每个线程的o都不是同一个。1线程的o.wait()后,只执行了2线程的o.notifyAll()。所以1线程会一直处于等待中。如果要达到你的要求,修改构造函数,去掉o = new Object();这句。因为这句会在每次初始化一个新线程时,改变o的指向。 参考技术A 在你的构造方法里o赋值去掉就OK了

以上是关于这段java 多线程代码为啥id是1的线程一直在等待?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不使用大量的多线程代码?

为啥局部变量在 Java 中是线程安全的

为啥这段 Java 代码没有利用所有 CPU 内核?

为啥 C++ 中的多线程会降低性能

java定时任务使用多线程webservcie执行了两次这是为啥?

C++ 无法理解为啥这段代码不是线程安全的