while (true) {
synchronized (obj) {
if (num > 0) {
System.out.println(getName() + "卖出去了一张票,还剩" + (--num) + "张票");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
break;
}
}
}
while (num>0){
synchronized (obj){
System.out.println(getName()+"卖出去了一张票,还剩"+(--num)+"张票");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
在这个地方纠结了一下为什么第二个方式不行,最后想明白原因是因为,就算对整个代码块加上了同步锁,但是在while num>0 判断过之后,可能三个线程同时为零的时候都通过了判断条件,然后依次进入就导致了值的溢出