CAS以及自旋锁原理分析
CAS是什么
CAS ===> CompareAndSet 比较并交换
如果线程的期望值与物理内存的真实值一样,将修改为更新值并返回true,如不同,则修改失败,这时需要重新获得主物理内存的真实值。
AtomicInteger atomicInteger = new AtomicInteger(2019);
atomicInteger.compareAndSet(2019,2020);
结果为true,真实值被更新为2020
再输入:
atomicInteger.compareAndSet(2019,1111);
结果为false,期望值已经不是2019,而是刚才更新的2020
CAS的底层原理
CAS的全称为Compare-And-Swap,它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。
Unsafe类+自旋锁
public final int getAndIncrement(){return unsafe.getAndAddInt(this,valueoffset,1);
}
unsafe类来自jre–>lib–>rt.jar–>sun.misc.unsafe
unsafe类大部分为native方法,让Java直接操作底层原语的CPU指令,所以可以保证原子性。
自旋锁:
public final int getAndAddInt(Object var1,long var2,int var4){int var5;do{var5 = this.getIntVolatile(var1,var2);}while(!this.compareAndSwapInt(var1,var2,var5,var5+var4))return var5;
}
如果比对不成功,则一直自旋直到成功为止。
CAS的缺点
1.循环时间长,CPU开销很大
2.只能保证一个共享变量的原子操作
对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候可以用锁来保证原子性
3.ABA问题
“狸猫换太子”
CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化,有猫腻。
例如:一个线程One从内存位置V中取出A,这时候另一个线程Two也从内存中取出A,并且线程Two进行了一些操作将值变成了B,并且Two马上又将V位置的数据变回A,这时候One线程进行CAS操作发现内存中仍然是A,One操作成功,但这个A是经历过了ABA这么一个过程的A,尽管One的CAS操作成功,但是不代表这个过程就是没有问题的。
原子引用解决ABA问题
在原子引用上使用带时间戳的原子引用类。即AtomicStampedReference类。
CAS以及自旋锁原理分析相关推荐
- 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁
文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...
- 自旋锁原理及其应用场景
题外话 自旋锁不是一种锁(类型),自旋锁是线程没有获取到锁时的一种等待策略. 自旋锁的提出背景 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要 ...
- CAS SSO用户认证原理分析
cas中重要的三个关键词: TGT: 缓存在cas server用户登录标识的票据(可以存放在mongodb,mysql等数据存储介质中,默认是放在本地内存中) TGC:缓存在浏览器cookie中用户 ...
- Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,Java S ...
- java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...
- Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
Java锁-偏向锁.轻量级锁.自旋锁.重量级锁 之前做过一个测试,反复执行过多次,发现结果是一样的: 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对): AtomicInte ...
- 06. 多线程锁原理
一.锁的分类 1.什么是锁 锁 大门 很多陌生人(线程)就进不去,很安全; 如果没有锁,无法锁住这个大门,很多陌生人都可以进去,不安全; 人进去后,再锁住(线程进去后,锁定) 那么在外面的很多人就进不 ...
- C++性能优化(十二)——自旋锁
一.互斥锁 1.互斥锁简介 互斥锁属于sleep-waiting类型锁.Linux Kernel 2.6.x稳定版开始,Linux的互斥锁都是futex (Fast Usermode Mutex)锁. ...
- 乐观锁与悲观锁、自旋锁
乐观锁 乐观锁是一种乐观的思想,即认为读多写少,遇到并发的可能性低,每次拿数据时都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CA ...
最新文章
- 2021年大数据常用语言Scala(二十七):函数式编程 聚合操作
- darwin转发时,摄像机在3G和4G模式下的参数设置
- 简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考
- 【MM模块】 Blanket PO 框架订单
- list集合去重的三种方式
- overleaf文章管理
- 一键装机linux_(推荐)linux用一键安装包
- 【IDEA】idea es 报错 Cause: invalid type code: 2D
- add in Web.config
- 15-4 队列实现调度器
- SetLayeredWindowAttributes 设置窗口透明
- 前端面试之那些稀奇古怪的问题
- 设计模式读书笔记之结构型模式
- h桥程序控制c语言,H桥电路原理及直流电机驱动编程
- Metaverse 元宇宙入门-06-Interchange Tools + Standards and the Metaverse 交换工具+标准和元界
- 游戏视觉内容逆向破解
- 小红书电商入驻全流程指南
- 推荐系统[八]:推荐系统常遇到问题和解决方案[物品冷启动问题、多目标平衡问题、数据实时性问题等]
- 使用PHPExcel类库编写一个快捷的导出函数
- GPON ITU-T G.xxx 标准协议下载
热门文章
- 平时的一些手绘,有点拿不出手哈
- 美通社企业新闻汇总 | 2019.2.13 | 2018年淘宝慈善筹集4.4亿元;洲际酒店集团收购六善酒店...
- php视频缓存怎么打开,牧马人撒哈拉不适合4寸以上升高的理由!
- easyui默认图标的使用和如何添加自己想要的图标
- Android BroadcastReceiver广播接收android:priority优先级超过1000,达到2147483647时,广播优先级是否生效
- SPI专题(一) SPI简介
- 公开说说别人看不到_说说发了但别人看不到
- 适用于AG的AI:农业生产机器学习
- Firebird与MySQL: 钟为谁鸣
- 不会读代码的程序员,不是好厨师