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. Google colab: 修改系统时间 change system time
  2. 关于时间类型数据的转换
  3. 苹果8怎么投屏到电视_创维电视怎么投屏
  4. java mysql 文本导入数据语句_Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL...
  5. typedef 数组使用详解
  6. LeetCode 1169. 查询无效交易
  7. 世界定级 企业即时通讯软件
  8. Razor的主版页面框架
  9. 120. strtotime()
  10. 【前端面试】变量和类型计算
  11. JS搜索省份匹配出省份的所有城市
  12. hbase+phoenix开发预演小例子
  13. Text file busy问题解决
  14. 全面复盘Android开发者容易忽视的Backup功能
  15. 安卓手机做电脑摄像头(USB连接1080P 60FPS低延迟非常稳定)
  16. 网易邮箱注册界面设计 html
  17. 量化研究数据来源汇总
  18. MUI-grid(栅格),超小屏xs和小屏幕sm
  19. 简述几种常用的编码器数据格式
  20. twrp显示 failed to mount system

热门文章

  1. C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解
  2. 回顾Gartner 报告:2010年至2017年那些最酷的存储初创公司去哪儿了
  3. UE4中FString转UTF8及UTF8转FString
  4. GlusterFS分布式文件系统
  5. mysql之旅【第一篇】
  6. STL源码剖析-vector
  7. python精度_通过Python可以达到的最高时间精度范围是多少?
  8. SSH家政服务系统设计与实现答辩PPT免费下载
  9. 360解压电脑版安装包_鲁大师电脑版2020下载-鲁大师pc版安装包exe下载v6.1020.3005.1020 官方最新版...
  10. mariadb安装_MariaDB CentOS 安装的时候如何确定 Repo 地址