原子性与原子操作

原子性:如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。
原子性达到的目标:就是能使一个程序被完整的执行。
原子操作:不可被中断的一个或一系列的操作。


CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。


1.处理器如何实现原子操作:
   A。使用总线锁保证原子性。(缺点:这样多核处理器的性能降低)
   B。通过缓存锁定保证原子性。
2.Java如何实现原子操作:
   A。加锁 B。循环的CAS的方式
   使用CAS实现原子操作出现的问题:
   1)ABA问题
   2)时间开销大
   3)只能保证一个共享变量的原子操作。
注意:Jvm实现锁的方式都是用了循环CAS(偏向锁除外)


ABA问题


CAS看起来很爽,但是会导致“ABA问题”。


CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。


比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。如果链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。


解救办法:使用AtomicStampedReference来解决,这个类的compareAndSet方法的作用是首先检查当前引用是否等于与其引用,并且检查当前标志是否等于预期标志,全都相等则以原子方式将该引用和该标志的值设置为给定的更新值。


原子性有没有冲突确实没有查到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值