深入理解并发之CompareAndSet(CAS)

简介: 一、CAS简介CAS:Compare and Swap, 翻译成比较并交换。java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁,使用这些类在多核CPU的机器上会有比较好的性能.CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。

一、CAS简介

CAS:Compare and Swap, 翻译成比较并交换。

java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁,使用这些类在多核CPU的机器上会有比较好的性能.

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

今天我们主要是针对AtomicInteger的incrementAndGet做深入分析。

二、JAVA实现部分

循环的内容是

1.取得当前值

2.计算+1后的值

3.如果当前值没有被覆盖的话设置那个+1后的值

4.如果设置没成功, 再从1开始

在这个方法中可以看到compareAndSet这个方法,我们进入看一下。

调用UnSafe这个类的compareAndSwapInt

JAVA程序也就跟踪到这里为止了,剩下的就是通过JNI调用C程序了,可是我奇怪的是为什么变量名都是var1,var2这样的命名呢?JAVA编程规范不是说不使用1,2等没有含义的字符命名吗?

三、JNI原生实现部分

在openJDK中找到找到unsafe.cpp这个文件,代码如下:

核心方法是compxchg,这个方法所属的类文件是在OS_CPU目录下面,由此可以看出这个类是和CPU操作有关,进入代码如下:

这个方法里面都是汇编指命,看到LOCK_IF_MP也有锁指令实现的原子操作,其实CAS也算是有锁操作,只不过是由CPU来触发,比synchronized性能好的多。

原文如下:http://flychao88.iteye.com/blog/2269438

目录
相关文章
|
存储 Android开发 开发者
Compose 状态保存:rememberSaveable 原理分析
Compose 状态保存:rememberSaveable 原理分析
296 0
|
Java 容器 Spring
SpringBoot:详解依赖注入和使用配置文件
SpringBoot:详解依赖注入和使用配置文件
269 0
|
API Android开发 开发者
Android 12 适配指南——SplashScreen
Android 12(API 31)引入了 SplashScreen 相关API,用于开发Android应用的启动页。 SplashScreen相关API的引入影响在Andorid 12设备上运行的所有应用。若开发者未进行SplashScreen的适配工作,在应用冷启动和温启动时,可能会呈现两个启动页先后出现的情况(Android SplashScreen启动页 + Android应用自定义开发的启动页或引导页)。
2574 0
Android 12 适配指南——SplashScreen
|
安全 Java 网络安全
springcloud 入门(10) Spring Security 安全与权限(上)
springcloud 入门(10) Spring Security 安全与权限
1050 0
springcloud 入门(10) Spring Security 安全与权限(上)
|
12月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
317 6
|
9月前
|
Ubuntu 网络协议 Linux
快速部署WSL(Windows Subsystem for Linux)
WSL提供了一种轻量级的方法,使开发者能够在Windows上无缝运行Linux环境。通过本文介绍的步骤,可以快速安装、配置和使用WSL,以满足开发和测试的需求。
1646 8
|
11月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
1799 1
|
缓存 Java 测试技术
RecyclerView 优化—滑动性能提升
RecyclerView 优化—滑动性能提升
507 0
|
前端开发 Java API
使用JavaFX进行跨平台桌面应用开发的技术指南
【5月更文挑战第29天】JavaFX是Oracle的开源GUI工具包,用于跨平台桌面应用开发。它提供丰富的API、UI控件、图形动画支持及媒体集成。通过设置JDK和JavaFX SDK环境,使用IDE创建项目,编写并运行JavaFX代码,开发者可构建富客户端应用。遵循MVC模式、使用FXML和CSS,以及测试兼容性,能提升应用质量和用户体验。
Dart中的String类型定义与拼接
Dart中的String类型定义与拼接
171 0