我在课堂上有一个同步方法。 try子句中的代码调用z
和notifyAll()
。当我运行代码时,所有线程都根据输出运行。但是事实证明只有两个线程依次调用该方法。太可怕了。
我试图在一个非同步方法的while循环中编写一个同步块,并且效果很好。请注意,总共有5个线程。
这是同步方法:
wait()
我还试图将while循环放入同步块中,发生了同样的事情。
private synchronized void sell() {
while (ticketsLeft > 0) {
try {
System.out.println(Thread.currentThread().getName() + "__________" + (ticketsLeft--));
this.notifyAll();
Thread.sleep(10);
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.exit(0);
}
它的工作原理是,线程3和4依次调用该方法:
private void sell() {
synchronized (this) {
while (ticketsLeft > 0) {
try {
System.out.println(Thread.currentThread().getName() + "__________" + (ticketsLeft--));
this.notifyAll();
Thread.sleep(10);
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.exit(0);
}
}
在非同步方法内的while循环中使用同步块:
5__________100
1__________99
2__________98
3__________97
4__________96
3__________95
4__________94
3__________93
4__________92
3__________91
4__________90
3__________89
4__________88
3__________87
4__________86
3__________85
4__________84
3__________83
4__________82
3__________81
4__________80
它按我的预期工作:
private void sell() {
while (ticketsLeft > 0) {
try {
synchronized (this) {
System.out.println(Thread.currentThread().getName() + "__________" + (ticketsLeft--));
this.notifyAll();
Thread.sleep(10);
this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.exit(0);
}
谢谢你们阅读这个问题。很抱歉,我没有足够的声誉来发布图像。如果有人对此有任何想法,我将不胜感激。
答案 0 :(得分:0)
这里没有足够的信息来正确回答问题。但是,我认为这与在第二种情况下while循环位于同步块外部以及在第一种情况下while循环在同步方法内部有关。
在第二种方法中,所有线程将在while循环内等待,但对于第一种方法,它们将在while循环之外等待。
注意:同步方法和同步方法都在运行线程的类的当前实例上具有锁定。
希望这会有所帮助!! :-)