CAS详解
2022-11-22 15:14:01 0 举报
java cas思想
作者其他创作
大纲/内容
CAS 虽然高效地解决了原子操作,但是还是存在一些缺陷的,主要表现在三个方面:1.自旋 CAS 长时间地不成功,则会给 CPU 带来非常大的开销2.只能保证一个共享变量原子操作3.ABA 问题
概述
V:内存中实际的值,有可能被其他线程修改
U:当前线程要更新的值,参与了和V进行交换的值
AtomicMarkableReference可以理解为上面AtomicStampedReference的简化版,就是不关心修改过几次,仅仅关心是否修改过。因此变量mark是boolean类型,仅记录值是否有过修改。
v=5
20
修改为20
修改为10
V=U,返回E
线程1
U=E+1
10
线程3
CAS可以看做是乐观锁(对比数据库的悲观、乐观锁)的一种实现方式,Java原子类中的递增操作就通过CAS自旋实现的。CAS是一种无锁算法,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。
读取当前内存中的实际值赋值给E=V
线程2
compareAndSwapInt 方法接收 4 个参数,分别是:对象实例、内存偏移量、字段期望值、字段新值。
比较E和当前内存中的实际值V是否相等
ABA问题
解决方案数据库有个锁称为乐观锁,是一种基于数据版本实现数据同步的机制,每次修改一次数据,版本就会进行累加。同样,Java也提供了相应的原子引用类AtomicStampedReference<V>
相等
v=?
被其他线程修改,导致了不一样
不相等,返回当前的V
CAS算法
CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。
原值
这个过程存在时间差,期间内存中的实际值V有可能被其他线程修改
开始
应用
计算结果赋值给要更新的值U
font color=\"#f44336\" style=\"\
读取到值为10误以为没有改变
0 条评论
回复 删除
下一页