CAS是什么?

CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。

这个是要操作系统层面给的支持。

通过方法调用,我们可以发现,getAndIncrement方法调用getAndAddInt方法,最后调用的是compareAndSwapInt方法,即本文的主角CAS,接下来我们开始介绍CAS。

getAndAddInt方法解析:拿到内存位置的最新值v,使用CAS尝试修将内存位置的值修改为目标值v+delta,如果修改失败,则获取该内存位置的新值v,然后继续尝试,直至修改成功。

源码分析

最后调用了compareAndSwapInt方法,接着继续深入探讨该方法,该方法在Unsafe中对应的源码如下。

可以看到调用了“Atomic::cmpxchg”方法,“Atomic::cmpxchg”方法在linux_x86和windows_x86的实现如下。

CAS的缺点:

CAS虽然很高效的解决了原子操作问题,但是CAS仍然存在三大问题。

循环时间长开销很大。

只能保证一个共享变量的原子操作。

ABA问题。

循环时间长开销很大:

我们可以看到getAndAddInt方法执行时,如果CAS失败,会一直进行尝试。如果CAS长时间一直不成功,可能会给CPU带来很大的开销。

只能保证一个共享变量的原子操作:

当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性。

什么是ABA问题?ABA问题怎么解决?

如果内存地址V初次读取的值是A,并且在准备赋值的时候检查到它的值仍然为A,那我们就能说它的值没有被其他线程改变过了吗?

如果在这段期间它的值曾经被改成了B,后来又被改回为A,那CAS操作就会误认为它从来没有被改变过。这个漏洞称为CAS操作的“ABA”问题。Java并发包为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。因此,在使用CAS前要考虑清楚“ABA”问题是否会影响程序并发的正确性,如果需要解决ABA问题,改用传统的互斥同步可能会比原子类更高效。

参见

原文:https://blog.csdn.net/v123411739/article/details/79561458

cas与java锁_JAVA之锁-cas相关推荐

  1. java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)

    转自http://www.cnblogs.com/redcreen/archive/2011/03/29/1998801.html 大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的 ...

  2. java线程池 锁_java多线程——锁

    这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...

  3. java悲观锁_Java乐观锁、悲观锁

    乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号 ...

  4. java mysql 分布式锁_Java分布式锁之数据库方式实现

    之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...

  5. java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...

    锁的实现 锁的实现其实很简单,主要使用Java中synchronized关键字. public class Lock { private volatile boolean isLocked = fal ...

  6. java 持久_Java持久锁总结 -解道Jdon

    并发主题 Java与持久相关的锁总结 本文总结Java中有关数据库保存持久数据的锁机制,不只是纯粹数据库自身的锁,本文主要就Java持久层三个技术数据库.JPA和Hibernate的锁应用进行了总结. ...

  7. java细粒度锁_Java细粒度锁实现的3种方式

    最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响.初步的想法是通过数据的时间戳,id等关键字来加锁,从而保证不同类型数据处理的并发性.而java自 ...

  8. java key锁_Java细粒度锁实现的3种方式

    转自:http://www.cnblogs.com/wxd0108/p/5488297.html 最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响 ...

  9. java web 锁_Java中锁的分类

    1.内部锁 就是对象本身,每个Java对象都可以隐式地扮演一个用于同步的锁的角色:这些内置的锁被称 为内部锁(intrinsic locks)或监视器锁(monitorlocks).执行线程进入syn ...

最新文章

  1. socket可能造成阻塞的函数有:connect()、accept()、读写函数、select()、poll()、gethostbyname()等
  2. 抄袭一些别人工作中的小技巧
  3. 电子计算机 俗称 它是一种具有,2013年计算机一级B试题模拟1
  4. [发布] 矩阵乘法及其对于编程求斐波那契数列的某一项的应用
  5. 计算机科学与技术mobi,080901-计算机科学和技术.PDF
  6. U-Net中的skip connection
  7. Ubuntu 16.04 火狐添加java插件、解决Firefox强制低版本java插件运行以及安全设置限制自签名应用程序运行
  8. linux文件系统之mount流程分析
  9. 计算机应用技术在医院的应用,计算机管理技术在医院的应用
  10. SQL语句BETWEEN
  11. C语言自学之路十(用C语言编写小游戏-五子棋)
  12. Quartz的CronTrigger
  13. php 冗余代码检测,冗余代码检查工具Simian | 求索阁
  14. Java初级程序员面试总结(三)--Lock篇
  15. 使用torch.nn.BatchNorm1d出现Tensor for argument #2 ‘weight‘ is on CPU, but expected it to on GPU错误
  16. 马云和他的少年阿里 百度云下载
  17. H.264中NALU、RBSP、SODB的关系 (弄清码流结构)
  18. vue 实现tab切换动态加载不同的组件
  19. ubuntu目录结构简述
  20. RealDWG加载DWG文件

热门文章

  1. MyBatsi-Mapper映射文件
  2. 给异地服务器远程ssh重装CentOS系统
  3. 【WCF】错误处理(二):错误码―—FaultCode
  4. utf-8编码引起js输出中文乱码的解决办法
  5. flex皮肤制作---通过flash
  6. SQL大全------之 oracle关于insert all的用法
  7. 今日之“烧饼油条”!
  8. Redis的AOF的配置
  9. 基于 asp access人人享二手车直卖网
  10. Python适合初学者入门