java CAS compareAndSet, compareAndSwap 区别

之前看源代码的时候,发现了有两个方法。一个是compareAndSet,一个是compareAndSwap, 傻傻分不清这两个到底哪个是CAS呢。

我看了java并发编程实战 找到了答案。

CAS 是一种计算机的指令。

CAS包含3个操作数, 需要读写的内存位置V,进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作。无论位置V的值是否等于A,都将返回V原有的值。(这种变化形式被称为比较并设置,无论操作是否成功都会返回。)CAS的含义是 我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少。

所以我们来看源代码。

11 protected final boolean compareAndSetState(int expect, int update) { 22 // See below for intrinsics setup to support this 33 return unsafe.compareAndSwapInt(this, stateOffset, expect, update); 44 }

上面的代码是AbstractQueuedSynchronizer 这个类中的方法。

可以看到 compareAndSetState 方法相当于compareAndSet 方法,是一个api。而我们来看它的实现,发现调用unsafe类的compareAndSwapInt。这里unsafe类可以调用计算机底层的东西。

所以我们可以得出CAS 是指的 compareAndSwap方法,意思是比较并交换。

java并发编程实战中给出这样一个模拟CAS的操作的示例:

 CAS的典型使用模式是: 首先从V中读取值A,并根据A计算新值B,然后再通过CAS以原子方式将V中的值由A变成B(只要在这期间没有任何线程将V的值修改为其他值)。由于CAS能检测到来自其他线程的干扰,因此即使不使用锁也能够实现原子的读 改 写操作序列。

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java多线程之CAS

CAS(CompareandSwap)CAS字面意思为比较并交换.CAS有3个操作数,分别是:内存值M,期望值E,更新值U。当且仅当内存值M和期望值E相等时,将内存值M修改为U,否则什么都不做。1.CAS的应用场景CAS只适用于线程冲突较少的情况。CAS的典型应用场景是:

操作系统学习笔记 原来自旋锁还可以这样实现!

在java中我们知道对线程使用CAS(compareandswap)来实现自旋锁,在没有学习操作系统之前,我以为这是唯一一种方法了。但是今天学到了操作系统中的同步互斥,终于明白了原来CAS、TS、Swap这些都是硬件提供的原子操作罢了!不仅CAS可以实现自旋锁,TS(TestandSet)同样可以!临界区临界区进程中访问临界资源的一段需要互斥执行

Java多线程并发06——CAS与AQS

在进行更近一步的了解Java锁的知识之前,我们需要先了解与锁有关的两个概念CAS与AQS。关注我的公众号「Java面典」了解更多Java相关知识点。CAS(CompareAndSwap/Set)概念CAS函数,是比较并交换函数,它是原子操作函数。原理CA

Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)

概述ConcurrentHashMap常用于并发编程,这里就从源码上来分析一下ConcurrentHashMap数据结构和底层原理。在开始之前先介绍一个算法,这个算法和Concurrent的实现是分不开的。CAS算法:CAS是英文单词CompareAndSwap的缩写,翻译过来就是比较并替换。CAS机制当中使用

Java并发机制底层实现原理

锁的膨胀过程预备知识CAS硬件对并发的支持在大多数处理器架构(包括IA32和Sparc)中采用的方法是实现一个比较并交换(CAS)指令,CAS包含了3个操作数——内存位置(V),预期原值(A),拟写入的新值(B),当且仅当VA时,CAS才会通过原子方式用新值(B)来更新(V)原有的值,无论操作成