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

本文探讨了线程安全问题的原因,包括并发操作共享数据导致的数据原子性破坏。超卖问题作为多线程安全的一个实例,分析了其产生原因并提出了解决方案,如加锁、使用volatile、CAS等。还详细解释了乐观锁和悲观锁的概念,指出synchronized关键字代表悲观锁,而volatile和CAS体现了乐观锁思想。
摘要由CSDN通过智能技术生成

一.线程安全问题

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

原因:

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个,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值