面试必备:CAS无锁机制

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没有绝对的好与坏,关键看使用场景。在并发量非常高的情况下,反而用同步锁更合适一些。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[js] 根据元素ID遍历树形结构,查找到所有父元素ID

[js] 根据元素ID遍历树形结构,查找到所有父元素ID var list [{ "orgId": 1, "orgName": "校长办公室1", "parentId": 0 },{ "orgId": 2, "orgName": "校长办公室2", "parentId"…

安装oracle和plsql心得

最近给两台裸机安装oracle,plsql,java运行环境等相关。从中分享一些小心得。 1.oracle安装,基本都是安装ORACLE11g的,中途遇到报错了是因为64位windows系统,需要重新拷贝对应文件夹到对应文件下。 2.plsql安装的话&…

[js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出?

[js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出? var data {count: 1,value: 2 } Object.defineProperty(data, count, {enumerable: true,configurable: true,get: function () {console.log(你访问了count, this.count); // 循环读取…

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})注解作用

有小伙伴在群里问到对 SpringBootApplication(exclude { DataSourceAutoConfiguration.class}) 有点疑惑,故记之。 exclude,排除此类的AutoConfig,即禁止 SpringBoot 自动注入数据源配置,怎么讲? DataSourceAutoConfi…

[js] 写一个方法,当给定数字位数不足8位时,则在左边补充0以补足8位数的方法

[js] 写一个方法&#xff0c;当给定数字位数不足8位时&#xff0c;则在左边补充0以补足8位数的方法 function padNumber(n, targetLen, placeholder) {const arr ("" n).split("");const diff arr.length - targetLen;if (diff < 0) {return Array(…

小程序json字符串取值问题,怎么取出来的是undefined,eval函数不能用?

1、后端返回的值 "{\"msg\":\"InvalidParameterValue.NoFaceInPhoto-图片中没有人脸。\",\"code\":500}” 关于为何会返回如上json字符串的场景&#xff1a;文件上传「声明了Content-Type」 wx.uploadFile({ url: common.apiServerwx/user…

asp.net mvc 自定义全局过滤器 验证用户是否登录

一般具有用户模块的系统都需要对用户是否登录进行验证&#xff0c;如果用户登录了就可以继续操作&#xff0c;否则退回用户的登录页面 对于这样的需求我们可以通过自定义一个独立的方法来完成验证的操作&#xff0c;但是这样代码的重复率就大大提高了 对于这样的需求&#xff0…

支付宝手机h5网页支付不再提供「继续浏览器付款」按钮了吗

来自圈友的疑惑&#xff0c;记录一下 之前写过一篇「支付宝手机h5支付的文章」&#xff0c;如果下载运行过Demo的小伙伴肯定发现了一个问题 > 「Demo中有显示继续浏览器付款按钮&#xff0c;但自己实际环境并没有」 难道是操作不对&#xff1f; 其实不然&#xff0c;这是两个…

[js] innerHTML与outerHTML有什么区别?

[js] innerHTML与outerHTML有什么区别&#xff1f; <div id"test"><h5>就是喜欢你</h5></div>document.getElementById("test").innerHTML //<h5>就是喜欢你</h5> document.getElementById("test").outHTM…

.NETFramework-Web.Mvc:ViewResult

ylbtech-.NETFramework-Web.Mvc&#xff1a;ViewResult1.程序集 System.Web.Mvc, Version5.2.3.0, Cultureneutral, PublicKeyToken31bf3856ad364e35返回顶部 1、#region 程序集 System.Web.Mvc, Version5.2.3.0, Cultureneutral, PublicKeyToken31bf3856ad364e35 // c:\users\…

ConcurrentHashMap底层原理?

本文为面试必备系列篇&#xff0c;不深入叙述&#xff0c;具体细节可自行查询。 可能会问的问题 1、用过ConcurrentHashMap吗&#xff1f;2、为什么要用ConcurrentHashMap&#xff1f;3、HashMap与HashTable的区别&#xff0c;引出ConcurrentHashMap…4、HashMap在多线程环境下…

[js] js操作节点的方法有哪些?

[js] js操作节点的方法有哪些&#xff1f; 创建节点createElement() 创建一个元素节点createTextNode() 创建一个文本节点createAttribute() 创建一个属性节点createComment() 创建一个注释节点插入节点appendChild() 把节点插入到父节点的末尾insertBefore() 把节点插入到父节…

【刷题】洛谷 P2709 小B的询问

题目描述 小B有一个序列&#xff0c;包含N个1~K之间的整数。他一共有M个询问&#xff0c;每个询问给定一个区间[L..R]&#xff0c;求Sigma(c(i)^2)的值,其中i的值从1到K&#xff0c;其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。 输入输出格式 输入格式&…

支付宝支付-当面付之扫码支付「扫码支付」

前言 支付宝支付—沙箱环境使用支付宝支付-支付宝PC端扫码支付支付宝支付-手机浏览器H5支付支付宝支付-当面付之扫码支付「本文」 当面付包含两种支付方式&#xff1a;商品条形码支付 扫码支付 经过前面两篇PC端扫码支付、手机H5支付&#xff0c;我们可以看到一个共同的特点就…

[js] 写一个格式化时间的方法

[js] 写一个格式化时间的方法 function dateToString(date, format yyyy-MM-dd) {const d new Date(date);let result format;const _config {y: d.getFullYear(),M: d.getMonth() 1, // 月d: d.getDate(), // 日h: d.getHours(), // 小时m: d.getMinutes(), // 分s: d.g…

01: awk常用

1.1 awk基本使用 1、找出当前登录用户数量 [rootlocalhost ~]# w14:09:07 up 48 min, 2 users, load average: 0.00, 0.01, 0.06 USER TTY FROM LOGIN IDLE JCPU PCPU WHAT root :0 :0 204月18 ?xdm? 59.24s 0.04s g…

MybatisCodeHelperNew-2.8.1-191-201插件使用

本文测试环境IDEA_2020.1&#xff0c;文中提供了MacOS用户操作截图 1、文件解压后放置plugs插件目录「Windows」 扫码回复「139」 下载后将文件解压&#xff0c;将压缩包内的 MyBatisCodeHelper-Pro 放入 IDEA 安装目录的 plugins 目录。 2、如果你是MacOS用户「MacOS」 同样找…

[js] pjax和ajax的区别是什么?

[js] pjax和ajax的区别是什么&#xff1f; pjax 是一个 jQuery 插件&#xff0c;它通过 ajax 和 pushState 技术提供了极速的&#xff08;无刷新 ajax 加载&#xff09;浏览体验&#xff0c;并且保持了真实的地址、网页标题&#xff0c;浏览器的后退&#xff08;前进&#xff…

Redis简单案例(四) Session的管理

Redis简单案例(四) Session的管理 原文:Redis简单案例(四) Session的管理负载均衡&#xff0c;这应该是一个永恒的话题&#xff0c;也是一个十分重要的话题。毕竟当网站成长到一定程度&#xff0c;访问量自然也是会跟着增长&#xff0c;这个时候&#xff0c; 一般都会对其进行负…

MacOS中Elasticsearch的安装「借助Homebrew」

1、Homebrew 如果你已经安装过Homebrew了&#xff0c;那么你可以跳过这一步&#xff0c;直接进行Elasticsearch安装步骤&#xff1b; Homebrew是一款MacOS平台下的软件包管理工具&#xff0c;拥有安装、卸载、更新、查看、搜索等很多实用的功能&#xff0c;强烈推荐安装。 请…