深入理解并发之CompareAndSet(CAS)

一、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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏salesforce零基础学习

salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)

Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pd...

31160
来自专栏Java编程

Java多线程Thread VS Runnable详解

进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之...

34600
来自专栏流柯技术学院

LoadRunner上传及下载文件

         web_submit_data("importStudent.do",

29520
来自专栏linux驱动个人学习

Memory barrier 简介

程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理由是为了提升程序运行时的性能。内存乱序访问主要发生...

13030
来自专栏有趣的django

CRM客户关系管理系统(九) 第九章、filter_horizontal优化和kingadmin删除功能

20900
来自专栏张善友的专栏

Contact Manager Web API 示例[2] Web API Routing

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地...

19190
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x05抓取应用的banner --推断服务

0x05抓取应用的banner --推断服务 先扫描出开放的端口,然后我们向它发送一个数据并等待响应,根据收集到的响应,我们就能推断出目标主机和端口上运行的服务...

27860
来自专栏python3

习题11:提问

How old are you? 18 How tall are you? 180 How much do you weight? 130 So,you're ...

8730
来自专栏wym

面向连接的c语言/socket 程序流程(TCP)

   int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

17320
来自专栏决胜机器学习

设计模式专题(十九) ——命令模式

设计模式专题(十九)——命令模式 (原创内容,转载请注明来源,谢谢) 一、概念 命令模式(Command)将一个请求封装为一个对象,从而可用不同的请求对客户进...

365150

扫码关注云+社区

领取腾讯云代金券