线程安全问题产生的原理

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

在这里插入图片描述
解决线程安全问题:同步代码块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值