
if(tickets>0)...{
System.out.println(Thread.currentThread().getName()+" sell ticket "+tickets);
tickets--;
}
}
}
}
if(tickets>0)...{
System.out.println(Thread.currentThread().getName()+" sell ticket "+tickets);
tickets--;
}
}
}
}编译运行:

上面的程序存在隐患:
如果在售最后一张票时,各个线程进入到if(tickets>0)语句时,时间片都到期了,则下一次执行时间片时分别打印出1,0,-1,-2,-3这样的票,显然是不正确的。
我们运行程序之所以没有出现这种情况是因为时间片很短,但是在实际中经过长期运行就可能发生上面的隐患。
然而,真正找到错误原因又是很困难的。
下面我们使用Thread类的静态方法sleep,让隐患重现:

class TicketSystem...{
public static void main(String[] args)...{
SellThread st=new SellThread();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}