CAS无锁机制原理,面试高频问题之一,其实,日常开发中并不会直接使用CAS无锁机制,都是通过一系列封装好的工具类来使用,

说不定面试官不提问,都不知道有这么个东西存在。

1、能说一下你对CAS的理解吗?

参考回答:

通常我们提到保证多线程安全,会想到三种方式,一是使用Synchronize关键字,但是有个问题就是,使用了Synchronize加锁后的多线程相当于串行,执行效率并不是太高,所以在高并发场景下,使用第二种方式Lock锁,Lock锁要比使用Synchronize关键字在性能上有极大的提高,其实Lock锁底层就是通过AQS+CAS机制实现的;第三种方式就是使用Java并发包下的Atomic「e淘米客」原子操作类,使用了原子类后就不需要使用Synchronize关键字或者是Lock加锁也是线程安全的,原子类的底层就是基于CAS无锁算法实现的。

CAS 比较后再交换。CAS有三个操作数,旧值A,新值B,以及需要读取的内存值V,在更新一个变量时,当且仅当A=V相同时,CAS才会将内存值V修改为B,否则什么都不做。

参考回答有点啰嗦了,提到了CAS的应用场景原子类的使用,但多说点显得有丶东西

2、能说一下CAS的实现原理吗?

参考回答

Java里的CAS是通过调用Unsafe「安sei夫」类的native方法,再由C调用CPU底层命令实现的。

如果问到Unsafe?

Unsafe 这个类是 JDK 提供的一个比较底层的类,是一个不安全的类,官方不建议开发者使用的,为啥呢?①Unsafe在未来可能被移除,也就是高版本jdk可能无法运行;②Unsafe中不少方法中必须提供内存地址和被替换对象的地址,中间会有一些计算问题,一旦出现问题就会导致jvm实例崩溃;③Unsafe中提供的直接访问内存的方法不受jvm管理,需要手动操作,如果疏忽可能会触发内存泄漏;

Unsafe通常用来:「额外补充,了解即可

  • 内存管理:包括分配内存、释放内存
  • 操作类、对象、变量:通过获取对象和变量偏移量直接修改数据
  • 挂起与恢复:将线程阻塞或者恢复阻塞状态
  • CAS:调用 CPU 的 CAS 指令进行比较和交换
  • 内存屏障:定义内存屏障,避免指令重排序

如果你想了解加深CAS原理,那么可以敲出一个原子类变量,比如AtomicInteger,直接看一下他的源码,找一下Unsafe是怎么大量应用的。

3、能说一下CAS的优缺点?

缺点

  1. CPU开销比较大
    在并发量比较高的情况下,如果线程反复尝试更新一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。
  2. 只能保证一个共享变量的原子操作
    只能是一个变量的原子操作,无法确保整个代码块的原子性,也就是在需要保证2个及以上变量共同进行原子性的更新时,就不得不使用Synchronized了
  3. ABA问题
    假设有一个变量 A ,经修改后变为B,然后又修改为 A,实际已经修改过了,但 CAS 可能无法感知,造成了不合理的值修改操作。
    解决方案是:使用版本号,在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A

*优点

在一般情况下,性能优先于锁的使用。

4、最后补充

从思想上来说,Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。

CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。

CAS和Synchronized没有绝对的好与坏,关键看使用场景。在并发量非常高的情况下,反而用同步锁更合适一些。

面试必备:CAS无锁机制相关推荐

  1. 深入理解并发编程之CAS无锁机制与ABA问题

    深入理解并发编程之CAS无锁机制与ABA问题 文章目录 深入理解并发编程之CAS无锁机制与ABA问题 前言 一.什么是CAS无锁机制 二.CAS原理分析 1.AtomicLong自增分析 2.基于At ...

  2. C语言链表无锁化CAS,CAS无锁操作

    主要讲的是<Implementing Lock-Free Queues>的论点,具体直接看论文最好.这里总结些要点. CAS就是Compare And Swap.gcc可以调用: __sy ...

  3. Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php

    Atitit.Cas机制 软件开发 编程语言 无锁机制 java c# php 1. 为什么需要无锁操作1 2. 硬件支持 cas  atomic2 3. 无锁编程(Lock-Free)就是在某些应用 ...

  4. 徐无忌并发编程笔记:无锁机制CAS及其底层实现原理?

    徐无忌并发编程笔记:无锁机制CAS及其底层实现原理? 完成:第一遍 1.什么是CAS算法? compare and swap:比较与交换,是一种有名的无锁算法 CAS带来了一种无锁解决线程同步,冲突问 ...

  5. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理

    [重难点][JUC 04]synchronized 原理.ReentrantLock 原理.synchronized 和 Lock 的对比.CAS 无锁原理 文章目录 [重难点][JUC 04]syn ...

  6. Java CAS无锁技术深度解析

    在看AQS代码的时候,看到它很多地方调用了unsafe.compareAndSwapInt这类方法,百度了一下得知这叫CAS无锁技术. CAS原理深度分析 转自:https://blog.csdn.n ...

  7. CAS无锁队列的实现

    文章目录 1. 基本原理 2. 代码实现 2.1 使用链表实现无锁队列 2.2 使用数组实现环形无锁队列 3. ABA 问题及解决 4. 参考资料 1. 基本原理 源于1994年10月发表在国际并行与 ...

  8. 悲观锁和乐观锁_面试必备之乐观锁与悲观锁

    何谓悲观锁与乐观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人. 大家可以点 ...

  9. 面试必备之乐观锁与悲观锁

    本文已经收录进 Github 90k+ Star 的 Java项目 : https://github.com/Snailclimb/JavaGuide .学 Java/准备 Java 面试 ,首选 J ...

最新文章

  1. Tomcat 服务器的端口号的修改
  2. bind安装配置以及应用
  3. Spring Boot基础讲解
  4. 神级代码编辑软件(Sublime Text 3) v3.3114 汉化特别版
  5. [转] boost库的Singleton的实现以及static成员的初始化问题
  6. IDEA在线和离线安装lombok
  7. socketio mysql_socket.io 在java与微信小程序上的应用
  8. godotenv简介
  9. RabbitMQ的基本概念
  10. 连接主机Java网络编程(一)- 一个简单的服务端/客户端应用程序
  11. Packet Tracer 思科模拟器入门教程 之九 路由器的基本配置
  12. c++三国杀【免费复制】——转载
  13. java mysql geometry_java程序操作Geometry对象
  14. 优秀的 Verilog/FPGA开源网站介绍
  15. iphone html5音乐播放器,从界面到功能 五款iPhone音乐播放器年度横评
  16. 实验二+108+曾宏宇
  17. Python崛起:“人生苦短,我用Python”并非一句戏言
  18. 西工大:那些人儿、那些事儿
  19. Opencv的RGB到HSV颜色空间转换
  20. Python实现计算GPA加权平均分

热门文章

  1. [html] 对一个元素设置浮动后,它的特征是什么?
  2. [vue-cli]vue-cli3插件有写过吗?怎么写一个代码生成插件?
  3. 工作92:500错误
  4. 前端学习(1681):前端系列实战课程之让蛇动起来
  5. 前端学习(1647):前端系列实战课程之选项卡实现js思路
  6. 前端学习(1254):Vue前后端交互方式
  7. 前端学习(667):运算符优先级
  8. 第三十期:程序员报告:男性占比超87% 北京月薪12184元最高
  9. 第十四期: 拥有7000多万店铺和10多亿件商品的微店如何打造AI系统?
  10. Qt MQTT安装步骤记录