原子操作CAS

一、原子操作
原子操作(atomic operation)不需要 synchronized。原子操作指的是不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。

二、什么是CAS
CAScompare and swap的缩写,即比较交换CAS是乐观锁。在java中锁分为乐观锁悲观锁悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,性能悲观锁有很大的提高。

三、CAS算法思想
指令级别保证这是一个原子操作:CAS其底层是通过CPU1条指令来完成3个步骤,因此其本身是一个原子性操作,不存在其执行某一个步骤的时候而被中断的可能。

CAS(v, e , n)
    - v : 表示要更新的变量
    - e : 表示变量的预期值
    - n : 表示变量的新值

当且仅当 v 的实际值等于 e 值时, 才会将 v 的值设为 n 
如果 v 值和 e 值不同,则说明已经有其他线程做了更新,那么当前线程什么都不做,即更新失败。
CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。
当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。
失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

四、CAS的优缺点
优点

  • 并发量不是很高时CAS机制会提高效率
  • 在一般情况下,性能优先于锁的使用

缺点

  • CPU消耗大,CAS线程会不停自旋,如果并发量大的话,将会不停重试,还不释放CPU,极端情况下会耗光资源。
  • 只能保证某个变量的原子操作(这里可以用并发包里面的原子更新类AtomicReference实现)
  • ABA问题 (在JAVA并发包里面AtomicStampedReference类用了版本号来解决ABA问题)。
  • 它将使调用者处理竞争问题(通过重试、回退、放弃),而在锁中能自动处理竞争问题。

五 、原子操作类
在这里插入图片描述
使用场景 使用原子操作代替synchronized加锁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值