文档章节

Java 并发编程之 CAS

编走编想
 编走编想
发布于 2013/05/26 19:40
字数 684
阅读 2673
收藏 20

JDK 5 的并发包中提供了很多类,这些类提供了比原有的并发机制更好的性能和伸缩性。要想理解这些类的工作机理,那就不得不提到 CAS。CAS 全称是 Compare and Swap,是指现代主流 CPU 都支持的一种指令,这个指令能为多线程编程带来更好的性能(稍后会详细介绍)。另外一个可能会被当做 CAS 的是 Compare and Set,是指 JDK 5 并发包中广泛使用的一种基于 Compare and Swap 的并发算法。严格说 CAS 仅指代前者。

###Compare and Swap### 在这里,CAS 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。简单介绍一下这个指令的操作过程:首先,CPU 会将内存中将要被更改的数据与期望的值做比较。然后,当这两个值相等时,CPU 才会将内存中的数值替换为新的值。否则便不做操作。最后,CPU 会将旧的数值返回。这一系列的操作是原子的。它们虽然看似复杂,但却是 Java 5 并发机制优于原有锁机制的根本。简单来说,CAS 的含义是“我认为原有的值应该是什么,如果是,则将原有的值更新为新值,否则不做修改,并告诉我原来的值是多少”(这段描述引自《Java Concurrency in Practice》)

###Compare and Set### 在理解了什么是 Compare and Swap 之后,理解 Compare and Set 便很容易了。Compare and Set 就是利用 Compare and Swap 实现的非阻塞的线程安全的写操作算法。它的实现过程如下:首先读取你要更改的数据的原值,然后将其和你要更新成的值作为 Compare and Swap 操作的两个参数,如果 Compare and Swap 的返回值和原值不同,便重复这一过程,直至成功。写成伪代码如下

int old;
int new;
do {
    old = value.get();
    new = doSomeCalcBasedOn(old)
while (value.compareAndSwap(old, new));

Compare and Set 是一个非阻塞的算法,这是它的优势。但是有一个问题就是存在这样的可能,在每次读操作之后,写操作之前,都有另外一个线程更改了原先的值,这样 Compare and Set 操作就会不停地重试。但这样的可能只存在于理论,在实际中很少发生。

Compare and Set 广泛使用在 Java 5 中的 Atomic 类中,其它的诸如 ReetrantLock、Semaphore 等的类也通过 AbstractQueuedSynchronizer 类间接地使用了 Compare and Set。

© 著作权归作者所有

共有 人打赏支持
编走编想
粉丝 142
博文 126
码字总数 107958
作品 0
海淀
程序员
加载中

评论(1)

shking
shking
已阅
Java并发编程基础-锁-synchronized状态变换

synchoronized在Jdk1.6之前一直被称为重量锁,性能较差,很少被推荐使用。synchoronized在Jdk1.6中进行了大量优化,性能与JUC中的各种锁无差,也被逐渐的被大众所接受。 synchoronized将锁状...

black-star
09/15
0
0
Java并发编程——由一个自旋锁介绍CAS操作

记得刚开始写java后端的时候,指导我的同事告诉我,作为一个后端开发,可读性在大部分情况下优于性能。可读性意味着我们要写出简单、清晰、易懂的代码。对于一个java后端开发者,这并不意味着...

黄炎dyn
06/03
0
0
Java Concurrency(二)——J.U.C atomic包源码解读

java5之后的java.util.concurrent包是世界级并发大师Doug Lea的作品,里面主要实现了 atomic包里Integer/Long对应的原子类,主要基于CAS; 一些同步子,包括Lock,CountDownLatch,Semaphore...

谦谦君子
2015/01/06
0
2
Java 并发- Atomic类的深入分析

AtomicXXX类, 都是基本数据类型原子操作的封装类. 看源码AtomicXXX类, 实际上都需要native方法的支持, native方法则采用CAS算法, CAS算法是一种无锁算法,CAS是CPU支持的指令. 我的理解CAS是这...

JoyGao
2013/11/27
0
0
Java并发机制及锁的实现原理

Java并发编程概述 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面...

烂猪皮
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

控件WebView显示网页

一、代码编写 (一)方法一:通过打开app直接打开指定网站 1.打开Android Stutio,新建一个工程,名为Sdca。注意,名称开头必须为大写。 2.添加WebView控件 打开app esactivity_main.xml添加...

lanyu96
24分钟前
2
0
WinRAR 去除弹窗广告

想要去除它,需要用到另外一个工具resource hacker,百度一下,下载它,工具很小,安装也简单。安装过后,找到winrar安装目录下的WinRAR.exe文件,右击选择 open useing resource hacker打开...

YunOu
37分钟前
2
0
Bash工作管理详解

Bash工作管理 Bash的工作是对具体任务的一个抽象表述,更确切的说是对管道的应用上的表述。Bash中的工作在形式上表现为一组相关进程或单个进程。工作进程组分为前台和后台,前台进程会对键盘...

小陶小陶
41分钟前
2
0
Qt那些事0.0.1

LIBS += -L$$PWD/lib/ -lStv1QMAKE_POST_LINK += $$QMAKE_COPY $$replace(PWD,"/","\\")\lib\Stv1.dll $$replace(OUT_PWD,"/","\\")\debug\Stv1.dll pro文件里,写起来按理说应该是轻松地......

Ev4n
51分钟前
2
0
如何正确的使用动态VPS(Linux)自动更换IP

背景 现在越来越多的人开始玩网赚项目,蚂蚁再小也是肉,薅羊毛的羊毛党越来越多,一些网赚项目也越来越受欢迎,但是一般的网赚项目都是要求真实用户的,所以要想获得大量的真实ip,一种动态...

bengozhong
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部