class MyThread2 implements Runnable{
private int ticket=10;
@Override
public void run() {
while(true){
if(this.ticket>0){
try {
Thread.sleep(100); //模拟网络延迟
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"+卖票,ticket="+this.ticket--);
}else{
System.out.println("*******票已被抢光*******");
break;
}
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) throws InterruptedException{
MyThread2 mt=new MyThread2();
new Thread(mt,"票贩子A").start();
new Thread(mt,"票贩子B").start();
new Thread(mt,"票贩子C").start();
}
}
票贩子C+卖票,ticket=9
票贩子B+卖票,ticket=8
票贩子A+卖票,ticket=10
票贩子C+卖票,ticket=7
票贩子A+卖票,ticket=6
票贩子B+卖票,ticket=5
票贩子C+卖票,ticket=4
票贩子B+卖票,ticket=3
票贩子A+卖票,ticket=2
票贩子C+卖票,ticket=1
*******票已被抢光*******
票贩子B+卖票,ticket=0
*******票已被抢光*******
票贩子A+卖票,ticket=-1
*******票已被抢光*******
可以看到票数有为负数的情况。
分析:当只剩最后一张票的时候,A去买票了,首先判断this.ticket>0成立,然后sleep(100)了,没有执行ticket–,在A sleep的时候B来了,由于A的操作还没有执行到ticket–,B判断this.ticket>0也成立,然后B也sleep了,C同理,Asleep时间到了,把票取走了,B和C醒了,没票了。