搜索
写经验 领红包
 > 影视

cas是干嘛用的(cas是什么意思如何实现)

在生活中,很多人可能想了解和弄清楚当被问到CAS有哪些坑?的相关问题?那么关于cas是干嘛用的的答案我来给大家详细解答下。

cas是干嘛用的(cas是什么意思,如何实现)

CAS是什么?

CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。

CAS是一项基于乐观锁的非阻塞技术(不需要线程的上下文切换),虽然CAS也有自己的一些缺点,但其通过操作系统底层提供的原子指令来实现lock-free的取得同步效果,在大多数情况下其效率和性能都要比synchronized和lock更好。

CAS的缺点:

(1)ABA问题

假如第一次读到的预期值是A,然后在这段时间间隔内A的值变化成B又变化成A,这个时候其实它的值已经被更新过了,但是如果只比较值是没法判断出来是否更新过的,虽然对于一些计数,求和的操作不影响结果,但这是有缺陷的。这个漏洞称为CAS操作的“ABA”问题。解决方法:通过版本号来判断,在每次更新后对应的版本号加1,这样一来在比较值之后如果相等,可以再次比较版本号来判断是否真的更新过。

Java并发包为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。因此,在使用CAS前要考虑清楚“ABA”问题是否会影响程序并发的正确性,如果需要解决ABA问题,改用传统的互斥同步可能会比原子类更高效。

(2)自旋多次循环导致的效率问题

CAS在判断两次读取的值不一样的时候会放弃操作,但为了保证结果正确,通常都会继续尝试循环再次发起CAS操作,如果连续多次CAS都失败,那么就会消耗大量的cpu资源。

(3)仅仅保证单个共享变量的原子操作?

CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效;只能保证一个共享变量的原子操作:当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性。

温馨提示:通过以上关于当被问到CAS有哪些坑?内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。