一、什么是cas
目录
- cas(compare-and-swap):简单翻译为比较并交换
功能:
判断内存某个位置的值是否为预期值,如果则更新为新的值,这个过程是原子的
cas是一条CPU并发原语,简单来说,cas是一条由CPU直接识别并执行的语句指令,用于对内存空间进行直接的管理。
cas并发原语体现在JAVA语言中Unsafe类的各个方法。原语是操作系统语言范畴,是由若干条指令组成,用于完成某一项特定的功能。暂且可以将CAS理解为一个黑盒,黑盒中存储许多指令,我们只需要调用黑盒,就可以直接对内存进行完整的操作。
cas的目的,结合JUC直接对内存进行操作管理。
2. Unsafe类:
是 CAS 的核心类,由于 Java 方法无法直接访问底层系统,需要通过本地( native )方法来访问, Unsafe 相当于一个后门,基于该类可以直接操作特定内存的数据。
Unsafe 类存在于 sun . misc 包中,其内部方法操作可以像 C 的指针一样直接操作内存,因为 Java 中 CAS 操作的执行依赖于 Unsafe 类 方法。
注意 Unsafe 类中的所有方法都是 native 修饰的,也就是说 Unsafe 类中的方法都直接调川操作系统底层资源执行相应任务。
变量 valueOffset ,表示该变量值在内存中的偏移地址,因为 Unsafe 就是根据内存偏移地址获取数据的
变量 value 用 volatile 修饰,保证了多线程之间的内存可见性。
public final int getAndIncrement(){
return unsafe.getAndAddInt(this,valueoffset,1);
}
总结:
CAS :比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致为止.
CAS 应用 :CAS 有3个操作数,内存值 V ,旧的预期值 A ,要修改的更新值 B 。当且仅当预期值 A 和内存值 V 相同时,将内存值 V 修改为 B ,否则什么都不做