Day297.CAS -Juc
Cas
一、什么是CAS
CAS,compare and swap的缩写,中文翻译成比较并交换。
一种算法,一种实现
线程安全的算法
运用场合,
并发
一种CPU指令
认为V的值
应该是A,如果是的话那我就把它改成B,如果不是A(说明有人修改过),那就不修改了
,避免多人同时修改导致出错CAS的三个操作数
- 内存值V
- 预期值A
- 要修改的值B
当前仅当内存值V等于预期值A时,于将内存值V修改为B,否则什么都不做。最后返回现在的V值
CPU的
特殊指令
由CPU保证了原子性操作
一个指令就包含很多的一系列操作
二、案例演示
- CAS的等价语义
/******@author 阿昌@create 2021-06-13 14:46******** 模拟CAS操作,等价代码*/
public class SimulatedCAS {private int value;/*** 模拟CAS操作* @param expectedValue 期盼值* @param newValue 修改值* @return 旧值*/public synchronized int compareAndSwap(int expectedValue, int newValue) {int oldValue = value;if (oldValue == expectedValue) {value = newValue;}return oldValue;}
}
- 案例演示: 两个线程竞争,其中一个落败
/******@author 阿昌@create 2021-06-13 14:46******** 两个线程竞争,其中一个落败*/
public class TwoThreadCompetition implements Runnable{private int value;/*** 模拟CAS操作* @param expectedValue 期盼值* @param newValue 修改值* @return 旧值*/public synchronized int compareAndSwap(int expectedValue, int newValue) {int oldValue = value;if (oldValue == expectedValue) {value = newValue;}return oldValue;}//主函数public static void main(String[] args) throws InterruptedException {TwoThreadCompetition r = new TwoThreadCompetition();r.value=0;//默认值Thread thread1 = new Thread(r,"线程1");Thread thread2 = new Thread(r,"线程2");thread1.start();thread2.start();thread1.join();thread2.join();System.out.println(r.value);}@Overridepublic void run() {compareAndSwap(0,1);}
}
三、应用场景
- 乐观锁
数据库version字段…
- 并发容器
如ConcurrentHashMap类中的putVal()方法
…
- 原子类
那么Java中如何利用CAS实现原子操作????接下来,用AtomicInteger作为例子分析
AtomicInteger加载
Unsafe
工具,用来直接操作内存
数据用Unsafe工具来实现底层操作
用volatile修饰value字段,保证可见性
以
getAndIncrement()方法
为例子这里出现了我们上面的模拟CAS语义的
compareAndSwapInt()方法
↓↓↓var5:返回的旧值
do-while是一个自旋,如果这次更新失败,他就会进行重试
发现,compareAndSwapInt()方法是被
native修饰的
上面用到了很多Unsafe类,那么Unsafe类是什么????
四、Unsafe类
以compareAndSwapInt()
为例子,发现他是native修饰的方法,底层有C++代码实现
通过之前的方法,获取带了这个底层C++代码的实现,如下:
- 总结上面的:那么Java中如何利用CAS实现原子操作???? 问题
五、CAS的缺点
1、ABA问题
什么是ABA问题呢?
就是说CAS操作就是比较当前值和期盼值是否相等,如果相等就修改为修改值;
比如当前值为5,期盼值为5,修改值为7;
那么如果线程A在判断比较当前值5和期盼值5相等后,在还没进行修改修改值时,期间有两个线程进来为线程B、线程C。线程B把当前值改为10,然后线程C把当前值改为5,那么就出现了ABA问题!!!
此时线程A还依然的任务这个当前值是没有被其他线程修改过的,但是实际上,当前值已经被修改了两次,但是其最终被修改的当前值结果等于线程A的期盼值的结果,也就是5=5;
那么如何解决ABA问题呢?
可以采用数据库的乐观锁方式,
采用version版本号
,每次修改就给version版本号+1
2、自旋时间过长
do-while的自旋循环
,如果再次期间线程竞争激烈或锁一直拿不到,他就会一直自旋,消耗CPU性能
Day297.CAS -Juc相关推荐
- Java怎么学,Java学习路线,程序员由浅到深学习之路
目录 友情提醒 第一章.Java基础 1.1)第一部分:Java 入门 1.2)第二部分:Java数组 1.3)第三部分:Java面向对象 1.4)第四部分:常用工具类 1.5)第五部分:集合体系 1 ...
- 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁
浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...
- 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等
CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...
- 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理
[重难点][JUC 04]synchronized 原理.ReentrantLock 原理.synchronized 和 Lock 的对比.CAS 无锁原理 文章目录 [重难点][JUC 04]syn ...
- 狂神JUC——CAS
JUC 1 狂神JUC--传统的Synchronized锁 2 狂神JUC--Lock锁 3 狂神JUC--Lock版生产者和消费者 4 狂神JUC--Synchronized版的生产者和消费者问题 ...
- juc是个什么鬼(一) Java并发包详情,CAS分析,解决ABA问题
JUC就是java.util.concurrent包,俗称java并发包 通过看JDK的API,我们发现JUC下有俩子包,分别是atomic和locks包,这篇文章重点就是看这两个包下的内容 Atom ...
- JUC多线程:Atomic原子类与CAS原理
一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...
- Java面试题目,CAS都不了解,你还怎么看J-U-C不可思议!
欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. 前言 说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS ...
- Java --- JUC之CAS
目录 一.CAS 二.CAS原理 三.CAS简单使用 四.CAS的实现 4.1.硬件级别保证 4.2.源码分析 五.Unsafe类 六.CAS的AtomicReference的使用 七.使用CAS实现 ...
最新文章
- 网站收录工具(php导航自动收录源码)_网站如何快速收录,网站不收录怎么办?...
- TEASER-plusplus 编译测试
- SQLite的事务处理方式
- Oracle常用数据库系统表单以及SQL的整理
- Tomcat集群快速入门2
- PL/SQL -- DML 触发器
- 2021年文山州一中高考成绩查询,云南文山第一中学2021年录取分数线
- bzoj 1045: [HAOI2008]糖果传递
- (译)iOS Code Signing: 解惑
- 仿美团酒店预订的html模板,jQuery手机端仿美团酒店预订日期选择插件
- 三读《UNIX编程艺术》——UNIX哲学
- 红米7pro支持html不,可以畅快的刷机了,红米Note 7 Pro等机型适配 TWRP
- 【MATLAB中UIGETFILE函数的用法】
- 阿里笔试 3.14 T1
- rain、rainy、raining的区别
- 国密算法 SM2 公钥加密 非对称加密 数字签名 密钥协商 python实现完整代码
- 无法打开包括文件: “ocl_macros.h”: No such file or directory
- 地面气象观测数据-A文件转excel方法
- ThinkPad 声卡出现未安装任何音频输出设备
- 【如何配置环境变量】