CAS-不可中断的典范
java
it书童
2021-01-09 17:18:10
0赞
0踩
57阅读
0评论
什么是CAS
我认为 V 的值应该是 A, 如果是的话我就把它改成 B,如果不是 A (说明已经被别人修改过了),那我就不修改了,避免多人同时修改导致出错
当且仅当预期值 A 和内存值 V 相同时,才将内存值修改为 B
利用了 CPU 的特殊指令,保证了原子性,先比较再更新,在 CPU 层面实现了原子性
CAS的等价代码
package juc.lock.cas;
/**
* 模拟 CAS 操作
*/
public class TwoThreadsCompetition implements Runnable {
private volatile int value;
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue) {
value = newValue;
}
return oldValue;
}
@Override
public void run() {
compareAndSwap(0, 1);
}
public static void main(String[] args) throws InterruptedException {
TwoThreadsCompetition r = new TwoThreadsCompetition();
r.value = 0;
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(r.value);
}
}
CAS的应用场景、源码分析
-
乐观锁
-
并发容器
-
原子类
CAS的缺点
-
ABA 问题:可以用版本号来解决此问题
-
自旋时间长
- 上一篇: atomic包-原子类
- 下一篇: spring 文档都不读,就想读懂源码?

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/1020
精品付费
个人开发者通过payjs接入微信支付
2584
0
这一次,真正掌握composer
1509
0
相关推荐
java session 入门到详解
181
0
Java 类的继承与接口实现的区别
165
0
Java 进程与线程入门介绍
167
0
Mybatis 一对多关系
140
0
Mybatis 多对多关系
151
0
Mybatis 使用注解实现数据表关系映射
151
0
spring 用于创建对象的注解
128
0
mac 使用 jenv 管理多个版本的 Java
455
0
springboot 整合连接池
160
0
SpringMvc 通过文件解析器上传文件
125
0
搭建 Eureka 注册中心
106
0
什么是 zuul
110
0
进程与线程的区别
118
0
不得不说的锁事
59
0