java并发编程-理解CAS算法
java并发编程-理解CAS算法
1.什么是cas算法?
CAS:Compare and Swap,即比较再交换。
jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronized同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。
2.CAS算法理解
CAS机制当中使用了3个基本操作数:主内存值V,旧的预期值A,要修改的新值B。
如下图
当两个线程并发修改主内存的值的时候每个线程都会经过如下过程。
- 如果变量的预期值A和主内存值的V相同时将主内存V的值修改为B。
- 否则做自旋操作,重新读取主内存的值,然后重新执行过程1。
注意,java中的这个cas的操作是一个原子操作,它是利用 JNI 来完成CPU 指令的操作,是c/c++实现的。
以AtomicInteger原子类的addAndGet方法为例
public final int addAndGet(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
}
Unsafe类中addAndGet方法实现
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
//do while 自旋操作
do {
//获取AtomicInteger对象在内存中偏移量为offset处的值
v = getIntVolatile(o, offset);
} while (!compareAndSwapInt(o, offset, v, v + delta));
return v;
}
CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题:ABA问题、循环时间长开销大、只能保证一个共享变量的原子操作。
2.CAS算法在java中的应用。
在java的java.util.concurrent包中提供了一组原子变量类。其中很多类使用了CAS操作。这些CAS操作基于Unsafe类中的native方法实现。
评论区
请写下您的评论...
猜你喜欢
java虚拟机(jvm)
1701
硬件的效率与一致性在正式讲解Java虚拟机并发相关的知识之前,我们先花费一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机
java基础
3918
java并发编程之service层处理并发事务加锁可能会无效最近注意到一个问题--在service层处理要多次操作数据库事务时往往要@Transactional事务注解,这个时候就要注意了,如果是在
java基础
1910
1.先看一下线程的生命周期转换图(学java的此图必背)本篇文章的主要目的不是分析线程的各种状态之间的转换,而主要是研究一下线程之间的通讯机制,以及Object的wait方法和notify方法。所以
weblog
5441
是时间复杂度确能降低到o(n2)。百科迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中
blog
并查集 算法分析
数据结构,算法基础
840
9
1
1
9
1
1
9
1
9
7
五、小结
路径压缩加上启发式合并就是并查集算法的最优解.一般来说用路径压缩算法就足够了,可以不再用启发式合并或者加权
blog
java基础-编译执行和解释执行
java虚拟机(jvm)
3095
概念:解释运行:一边对程序进行翻译,翻译成计算机可以执行的指令,一边交给计算机执行,翻译一句执行一句。编译运行:对整个程序先翻译成计算机可以理解的指令,然后计算机可以直接执行。java是解释执行还是
blog
十种排序算法理解(前五)
数据结构与算法
5453
十种排序算法理解(前五)1.冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。算法描述:比较相邻的元素。如果第一个比第二个大,就
blog
java注解的理解与运用
java基础
3647
法已经过时了。(当方法或是类上面有@Deprecated注解时,说明该方法或是类都已经过期不能再用,但不影响以前项目使用,提醒你新替代待的方法或是类。如果程序员不小心使用了它的元素,那么编译器会发出警告
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。