什么是CAS

Posted top啦它

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是CAS相关的知识,希望对你有一定的参考价值。

简单来说,cas就是比较并交换,它是一种用户态不涉及进程上下文切换的一种无锁的保证数据原子性的操作。它的原子性始在硬件层面通过lock前缀和比较并切换指令来实现的。在java层面的实现是Unsafe里面的compareAndSwapObject、conpareAndSwapInt、compareAndSwapLong,这三个方法都是native修饰的,也就是jvm层面实现的。用的时候按顺序给他传对象实例,字段偏移量,预估值,更新值,来使用。他在硬件方面的实现,主要就是对字段偏移量的操作,这个字段偏移量就是对象头+对象地址的大小,也就是12,还有就是我要更改的变量是第几个变量,以此来获取他的偏移量。硬件的实现就是现根据偏移量得到这个字段的地址,然后判断是否是多核环境,这个涉及到变量修改的可见性以及有序性和原子性,不同的系统有不同的实现,然后判断预估值和修改的字段的内存值是否相同,如果相同的话,则会将更新值赋给这个字段的内存值,然后及那个eax中存储的预估值设置到更新值中,如果不相同的话,则将字段的内存值写入预估值中。返回预估值,判断是否相等,相等的话则表示更新成功,否则表示更新失败。
cas也是存在缺陷的,比如ABA问题,只能修改一个共享变量,然后就是空转问题,还是会浪费cpu的,所以reentrantLock中在cas中进行了thread.yield操作,这也是一种节省cpu性能的方式。

以上是关于什么是CAS的主要内容,如果未能解决你的问题,请参考以下文章

什么是CAS

java - CAS及CAS底层原理

CAS和AQS

CAS,在硬件层面为并发安全保驾护航

CAS,在硬件层面为并发安全保驾护航

JAVA之锁-cas