根据线程安全问题的代码实现,*
一、关于卖出不存在的票
这里有t0、t1和t2三个线程一起抢cpu的执行权,谁抢到谁就可以执行
我们一步一步跟进这个结果:
直接到产生问题的地方:假设程序运行了一会,我们的共享资源ticket字段执行到了1之后:
1.t0线程抢到了cpu的执行权,进入到run方法中执行if语句,因为if中有sleep方法,所以失去了cpu的执行权进行睡眠.
2.t2线程抢到了cpu的执行权,进入到run方法中执行if语句,失去了cpu的执行权进行睡眠.
3.t1线程抢到了cpu的执行权,进入到run方法中执行if语句,失去了cpu的执行权进行睡眠,此时3个线程全部睡眠.
4.t2线程睡醒后执行卖票(输出语句:“Thread-2–>正在卖第1张票”),之后会执行ticket–,ticked就等于0了,循环语句继续判断0>0为false不执行.
5.此时t1睡醒了,抢到了cpu的执行权,继续执行卖票(输出语句:“Thread-1–>正在卖第0张票”),之后会执行ticket–,ticked就等于-1了,循环语句继续判断-1>0为false不执行.
6.此时t0睡醒了,抢到了cpu的执行权,继续执行卖票(输出语句:“Thread-0–>正在卖第-1张票”).之后会执行ticket–,ticked就等于-2了,循环语句继续判断-2>0为false不执行. 至此程序结束,产生出不存在的两张票:“0"和”-1";
二、关于卖出重复的票
是3个线程同时执行到卖票(输出语句),这时候的ticket还没有执行到.