Linux及操作系统网络原理

极简CAS

2020-12-24  本文已影响0人  chozee

CAS

  1. 乐观锁

  2. compare and then swap else 自旋

Atomic的核心操作就是CAS(compare and set,利用CMPXCHG指令实现,它是一个原子指令),该指令有三个操作数,变量的内存值V(value的缩写),变量的当前预期值E(exception的缩写),变量想要更新的值U(update的缩写),当内存值和当前预期值相同时,将变量的更新值覆盖内存值,执行伪代码如下。

if(V == E){ 
 V = U 
 return true 
}else{ 
 return false 
}

CAS问题:

解决方案:

  1. 加版本号(戳)

CAS本质还是需要CPU硬件指令进行支持

某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥

CAS 并发原语体现在 Java 语言中的 sum.misc.Unsafe 类中的各个方法。调用 Unsafe 类中的 CAS 方法, JVM 会帮助我们实现出 CAS 汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于 CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,CAS 是一条 CPU 的原子指令,不会造成数据不一致问题。

我们常用的 java.util.concurrent 包就建立在CAS之上。

Java的Automic 包的CAS实现

valatile

Unsafe通过native method直接操作特定内存地址中的数据

AtomicInteger 中的变量 valueOffset 表示该变量值在内存中的偏移地址,因为 UnSafe 就是根据内存偏移地址获取数据

如何保证原子性

本质还是互斥锁实现的compareAndSwap

上一篇下一篇

猜你喜欢

热点阅读