Java 之 CAS 原理及实现是怎样的?

发布于:2022-12-15 ⋅ 阅读:(728) ⋅ 点赞:(0)

面试官:CAS你知道吗?

你:嗯知道,CAS就是Compare and Swap,是项乐观锁技术。

面试官:原理

答:CAS是一种乐观锁机制,具体实现为 Unsafe类 + 自旋,通过Unsafe类提供硬件级别的原子性操作保证了并发安全,加上自旋操作,解决了 synchronized 在多线程环境下会出现的线程阻塞,唤醒切换,以及用户态内核态间的切换操作所带来的消耗。在由此扩展到AtomicInteger,这样就踏实了!

CAS 基本原理

CAS 主要包括两个操作:CompareSwap,有人可能要问了:两个操作能保证是原子性吗?可以的。

CAS 是一种系统原语,原语属于操作系统用语,原语由若干指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说 CAS 是一条 CPU 的原子指令,由操作系统硬件来保证。

在 Intel 的 CPU 中,使用 cmpxchg 指令。

回到 Java 语言,JDK 是在 1.5 版本后才引入 CAS 操作,在sun.misc.Unsafe这个类中定义了 CAS 相关的方法。

public final native boolean compareAndSwapObject(Object o, long offset, Object expected, Object x);

public final native boolean compareAndSwapInt(Object o, long offset, int expected, int x);

public final native boolean compareAndSwapLong(Object o, long offset, long expected, long x);

可以看到方法被声明为native,如果对 C++ 比较熟悉可以自行下载 OpenJDK 的源码查看 unsafe.cpp,这里不再展开分析。

CAS 在 Java 语言中的应用

在 Java 编程中我们通常不会直接使用到 CAS,都是通过 JDK 封装好的并发工具类来间接使用的,这些并发工具类都在java.util.concurrent包中。

J.U.C 是 java.util.concurrent的简称,也就是大家常说的 Java 并发编程工具包,面试常考,非常非常重要。

目前 CAS 在 JDK 中主要应用在 J.U.C 包下的 Atomic 相关类中。

比如说 AtomicInteger 类就可以解决 i++ 非原子性问题,通过查看源码可以发现主要是靠 volatile 关键字和 CAS 操作来实现。

弊端CAS虽然优点很多,但是也有三个大问题:

  • ABA问题:CAS操作时可能会存在这么一种情况,一个值原来是A,但是中途改为了B,最后又改回了A,那么使用CAS策略去检测的时候,发现A的值并没有变化,但事实上A是改变过的;这个就是ABA问题,解决ABA的思路是使用版本号,每次更新的时候把版本号加1,从java1.5开始,JDK的Atomic包里面提供了AtomicStampedReference来解决ABA问题。
  • 循环时间长,开销大:自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。
  • 只能保证一个共享变量的原子操作:如果要保证多个变量的原子性,需要额外的使用AtomicReference类来保证引用对象之间的原子性。


在学CAS操作的开始,了解这些术语对你的学习更加有帮助
 

Cas的客户端下载


自学JavaEE快速通关路径(依次向下顺序学习即可)
Java SE基础-打好JavaSE基础才能成为开发高手
Java基础:

Java入门基础视频教程,java零基础自学首选Java入门教程(含Java项目和Java真题)

Java Web-能制作中小型网站&企业管理系统
Javaweb:最新版JavaWeb基础教程,Java web从入门到企业实战完整版
MySQL数据库: MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

Java开发框架-Java企业级服务端开发技能
Maven:Maven全套教程,maven项目管理从基础到高级,Java项目开发必会管理工具maven
Git:Git全套教程,完整的git项目管理工具教程,一套精通git
SSM框架:2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术
MybatisPlus:MybatisPlus深入浅出教程,快速上手mybatisplus
Spring Boot:SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)
传智健康:Java项目《传智健康》,超完整的企业级医疗行业项目(基于SSM+Zookeeper+Dubbo+Spring Security技术栈)
瑞吉外卖:Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目

中间件&微服务框架-中级程序员的热门技术
Springcloud:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,史上最全面的springcloud微服务技术栈课程Java微服务
Dubbo:Dubbo快速入门,Java分布式框架必会的dubbo教程
Zookeeper:Zookeeper视频教程,快速入门zookeeper技术
RabbitMQ:RabbitMQ全套教程,rabbitmq消息中间件到实战
RocketMQ:RocketMQ系统精讲,电商分布式消息中间件,硬核揭秘双十一
Docker:Docker容器化技术,从零学会Docker教程
Redis:Redis入门到实战教程,全面透析redis底层原理+redis分布式锁+企业解决方案+redis实战
MongoDB:MongoDB基础入门到高级进阶,一套搞定mongodb
搜索技术:java中级教程-ELK高级搜索,全面的讲解ElasticStack技术栈

项目实战-企业级项目开发,掌握行业3年开发经验
人力资源:Java项目SaaS移动办公完整版《iHRM 人力资源管理系统》,跨行业SaaS办公整合性解决方案
好客租房:Java项目《好客租房》,Java企业级解决方案(Spring全家桶+分布式解决方案+微信授权+爬虫解决方案等)
权限管理一体化解决方案:Java品达通用权限项目,基于SpringCloud SpringBoot 的微服务框架的权限管理解决方案

觉得有帮助可以抓紧收藏,说不定啥时候失效了

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到