深入理解并发之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

目录
相关文章
|
5月前
|
Java Linux
如何实现无锁并发:深入理解CAS原理
如何实现无锁并发:深入理解CAS原理
211 2
|
Java 编译器 Linux
【多线程】锁策略、CAS、Synchronized
锁策略, cas 和 synchronized 优化过程
|
6月前
|
存储 算法 Java
|
6月前
|
算法
原子操作CAS
原子操作CAS
42 0
|
6月前
|
存储 消息中间件 算法
无锁CAS_无所队列
无锁CAS_无所队列
58 0
|
6月前
|
算法 Java 关系型数据库
CAS
本文主要讲解java中cas的概念及原理
64 0
|
安全
CAS和多线程密切相关的东西!
CAS和多线程密切相关的东西!
31 0
|
安全 算法 架构师
带你了解什么是无锁并发 CAS
带你了解什么是无锁并发 CAS
261 0
带你了解什么是无锁并发 CAS
什么是 CAS? CAS 有哪些缺点?ABA 问题是什么?
什么是 CAS? CAS 有哪些缺点?ABA 问题是什么?
202 0