JAVA并发编程梳理与学习五(原子操作CAS)

原子操作
1.什么是原子操作?
一个操作一旦开启就不会被打断,一直到操作完成。类似于事务,要么不执行,要执行就执行完,再去执行别的任务。
2.如何实现原子操作
(1)加锁。synchronized关键字是基于阻塞的锁机制,是一种悲观锁机制,就是一个线程一旦拿到了了锁,别的线程只能等待。
这样会有以下问题出现:
1》如果被阻塞的线程很重要优先级很高就可能出现问题
2》如果获取锁的线程要做大量运算比较耗时,那么别的线程只能处于等待状态
3》一旦一个线程拿到锁,别的竞争锁的线程可能被cpu调度出去,当锁释时,cpu再重新调度去竞争锁,这样就会浪费cpu资源
4》处理不好可能会出现死锁
(2)CSA机制
**原理:**乐观锁机制。利用现代处理器都支持CAS指令,是CPU指令级的操作不是java程序里面的操作。每一个CAS操作都包含内存地址V、期望值(原来值)A、新值(操作过后的值)B。
**具体过程:**先拿到旧值A存起来,然后操作A值得到B值,拿未操作过的旧值A和内存地址V存的值比较,如果相等,把内存地址V存的值替换为B;如果不行等,继续重复取值、改值、比较这一过程,知道成功为止。
注意:
1.这是一个操作系统指令,操作系统已经做了处理,保证比较和替换这2个过程期间不会有别的线程去操作A值
2.不会出现死循环,因为cpu操作指令事件很快很快
出现问题
1.ABA问题。如果只比较值,可能出现下面问题,假如线程A拿到原值为1、改变值变为2,再去比较时间,发生了线程B把值把该值由1->4->1,但是线程A比较是相等的,这中间其实是有别的线程操作的。
解决方案:加一个版本号
2.循环时间长cpu开销大。上面说过如果不成功会以死循环方式重新操作,直到成功。
3.只能保证一个共享变量的原子操作
解决方案:把多个变量编成一个变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值