有点小伙伴试了下,出现 3 3 2 0 1 这种不符合常理的结果,没有达到预想中的4 3 2 1 0这就是线程的交互执行导致的;举个例子:线程1先执行卖了1张票,也即是票--1,现在票为4,但是这个线程还没没有来得及在控制台打印出剩余多少票,线程又抢到了CPU资源执行,线程2又把票--1;此时票为3,线程2输出票就为3,线程2执行完了后,线程1又再次获得CPU资源,继续把刚刚没有输出的话输出,但是此时票已经为3了,于是又输出了3。 看过多线程的小伙伴应该不难理解,这就是线程不安全,想要保证输出结果,可以使用synchronized关键字来解决
2017-01-10
把售票的方法提取出来,再加上synchronized关键字,执行的时候就不会出错了
@Override
public void run() {
shoupiao();
}
public synchronized void shoupiao(){
while(ticketCount>0){
ticketCount--;
System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+ticketCount+"张票");
}
@Override
public void run() {
shoupiao();
}
public synchronized void shoupiao(){
while(ticketCount>0){
ticketCount--;
System.out.println(Thread.currentThread().getName()+"卖出了1张票,剩余"+ticketCount+"张票");
}
2016-11-27