JUC–CAS底层
其实在volatile的时候已经分享过程序原子性问题,而jdk提供的原子对象的底层逻辑就是CAS(compare-And-Swap)。
CAS底层
是硬件底层对于并发操作的支持(非计算机专业的不要求懂,需要汇编知识),volatile+CAS,实现程序并发的原子性
CAS 算法是硬件对于并发操作的支持
-
CAS 包含了三个操作数:
-
①内存值 V
-
②预估值 A
-
③更新值 B
-
当且仅当 V == A 时, V = B; 否则,不会执行任何操作。
以AtomicInteger为例
/**
* Atomically increments by one the current value.
*
* @return the previous value
*/
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);//获取内存中最新的旧值
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
原子类测试
public class CASDemo {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(1);
System.out.println(atomicInteger.compareAndSet(1,2020)+"t 当前值:"+atomicInteger.get());
System.out.println(atomicInteger.compareAndSet(1,2030)+"t 当前值:"+atomicInteger.get());
atomicInteger.getAndIncrement();
System.out.println("t 当前值:"+atomicInteger.get());
}
}
扩展:UNSafe类中的compareAndSwapInt,是一个本地方法,该方法的实现位于unsafe.cpp中
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
UnsafeWrapper("Unsafe_CompareAndSwapInt");
oop p = JNIHandles::resolve(obj);
jint* addr = (jint *) index_oop_from_field_offset_long(p, offset);
return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
UNSAFE_END
1、先想办法拿到变量value在内存中的地址。2、通过Atomic::cmpxchg实现比较替换,其中参数x是即将更新的值,参数e是原内存的值。
原文始发于微信公众号(云户):JUC–CAS底层
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/25863.html