文章目录
- 什么是cas
- CAS图
- 场景1
- 场景2
什么是cas 全称compare and swap(compare and exchange) 比较并交换
CAS图
文章图片
场景1 场景:代码对着某个int属性加一,单线程没问题,但是多线程的时候会有问题,因此要加锁
文章图片
假如不加锁synchrnoized的情况下,可以用上面的cas
文章图片
但是这种操作会引发ABA问题
文章图片
解决方法:加版本号进行判断(每次改的时候加个版本号,然后返回时进行判断)
在java中的应用
public class AtomicIntegerTest {
//AtomicInteger典型的cas
private static AtomicInteger m = new AtomicInteger ( 0) ;
public static void main(String[] args) throws Exception {
Thread[] threads = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
Object o = new Object();
for (int i = 0;
i < threads.length;
i++) {
threads[i] = new Thread(() -> {
for (int j = 0;
j < 10000;
j++) {
m.incrementAndGet();
//m++
}
latch.countDown();
});
}
Arrays.stream(threads).forEach((t) -> t.start());
latch.await();
System.out.println(m);
}
}
incrementAndGet()点进去看
/**
* Atomically increments by one the current value.
*
* @return the updated value
*/
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
getAndAddInt点进去看
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;
}
compareAndSwapInt这里用到了cas
compareAndSwapInt点进去看
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
场景2 synchrnoized里面也有用到
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)