CAS(compare And Set)CAS的实现原理?

CAS机制是一种乐观锁的机制,效率比较高

Java的中的CAS机制:
CAS 属于原子操作的一种,能够保证一次读写操作是原子的。CAS 通过将内存中的值与期望值进行比较,只有在两者相等时才会对内存中的值进行修改。 Java 中的 CAS 实现位于 sun.misc.Unsafe 类中,该类中定义了大量的CAS的 native(c语言实现) 方法

CAS 机制虽然无需加锁、安全且高效,但也存在一些缺点,概括如下:

	1、存在ABA问题,比如刚开始读取到备份是3,然后被其他线程连续修改两次,
	最终结果还是3,那么CAS很可能识别不到数据发生了改变,这种情况对程序造
	成了极大的安全隐患。可以通过添加版本号等标志位来解决该问题。
	2、循环时间长开销大,如果长时间自旋不成功,会给CPU带来很大开销。可以
	使用自适应自旋锁解决这个问题
	3、只能保证一个共享变量的原子操作。比如AtomicInteger这种的原子类都是每
	次只能对一个变量进行原子性控制。

ABA问题?

ABA 问题是指在 CAS 两次检查操作期间,目标变量的值由 A 变为 B,又变回 A,但是 CAS 看不到这中间的变换,对它来说目标变量的值并没有发生变化,一直是 A,所以 CAS 操作会继续更新目标变量的值。大部分时候该问题并不会对结果产生实质性影响,如果确实需要关心该问题,可以为目标变量引入版本特性。
(从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值