并发编程中的CAS机制

CAS是Java中Unsafe类的一个方法,用于在多线程环境中保证共享变量的原子性修改,避免加锁带来的性能开销。它通过compareAndSwapInt方法比较并替换变量值,如果预期值与当前值相同则进行更新。CAS是一个native方法,底层可能使用lock指令确保原子性,尤其在多核CPU环境下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是什么?

CAS是Java中Unsafe类里面的一个方法,它的全称叫compareAndSwap,比较并替换的意思,它的主要功能是能够保证在多线程环境下,对于共享变量修改的一个原子性。对于像read-write这样的操作,我们一般会加锁保证原子性问题,但是加同步锁一定会带来性能上的损耗,所以可以用CAS+volatile的方式来优化

例子

compareAndSwapInt四个参数分别是:对象实例、成员变量state在内存地址中的一个偏移量、预期值0、期望更改的值1

public class test{
	private volatile int state = 0;
	private static final Unsafe unsafe = Unsafe.getUnsafe();
	private static final long stateOffset;
	
	static {
		try{
			stateOffset = unsafe.objectFieldOffset(test.class.getDeclaredField("state"));
		}	catch (Exception ex){ throw new Error(ex);}
	} 
	
	public void doSomething(){
		if(unsafe.compareAndSwapInt(this,stateOffset,0,1)){
			// TODO
		}
	}
}

CAS机制会去比较state内存地址偏移量对应的值和传入的预期值0是否相等,如果相等就直接修改内存地址中state的值等于1,否则返回false,这个过程是一个原子的,不会有线程安全问题。

补充知识

compareAndSwap其实是一个native方法,它最终还是会面临同样的问题,就是先从内存地址中读取state值,然后比较,最后再去修改,这个过程不管什么层面去实现都会有原子性问题,所以它的底层实现里,如果在多核CPU环境下会增加一个lock指令来对缓存或者总线去加锁,从而保证比较并替换两个操作的原子性

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值