线程安全问题和多线程安全经典案例

一.线程安全问题

现象:多条线程消费(读取、更改)一些已经被消费过的数据。(消费:更改,更新)

原因:

1.每一个子线程都有自己的工作空间。

2.破坏了数据的原子性(不可分割)。(同时成功或者同时失败)

3.多条线程(并发)操作同一共享数据。

4.几乎无法预测线程的执行顺序。(每个子线程工作过程不透明)

5.只存在读数据的时候,不会产生线程安全问题。

二.超卖问题(超出了售卖的个数)

.现象:超卖又可以理解为过量出售。消费的个数超出了原有的库存量。现在卖10个豆浆机。

.产生的原因:某个服务或线程出售了不存在的库存量。

.问题分析:并发线程,共享数据,共同写操作会导致死锁。

.解决方法:

        a.加锁 (如使用synchronized,是操作为原子性,互斥区)

        b. 及时更新总量(如使用volatile)

        c.  添加补偿机制(CAS):如果已经发生了线程安全问题,去尝试补偿我这个线程。比如A和B同时抢到了第7个豆浆机,我就从总数里面再拿出一个给A或给B.

        d. 部分加锁:synchronized会影响性能。我可以在卖到第5个豆浆机的时候加锁。剩余数量范围在5-10时不加锁,当进入到超卖的临界值5时加锁。部分加锁是加锁的一种改进版。

        e. 预留安全库存量:我只卖8个,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值