当前位置: 首页 > >

线程安全问题产生的原理

发布时间:

根据线程安全问题的代码实现,*
一、关于卖出不存在的票
这里有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还没有执行到.



解决线程安全问题:同步代码块



友情链接: