CAS简介
CAS指的是Compare And Swap或者Compare And Set也即是比较并交换。CAS是原子操作,比较内存地址的当前值和期望值保证了交换操作基于最新值。如果其他线程修改了内存地址的值并且与期望值不同则造成CAS操作失败。
CAS是一种无锁(LOCK-FREE)操作(注:表面上看CAS是不加锁实际上在操作系统底层还是需要加锁,因为要确保取值,比较,交换的原子性)。
LOCK vs CAS
LOCK操作会陷入内核态也即是操作系统管理,对资源的加锁往往会引起其它线程的挂起操作。挂起需要保存线程的堆栈指针和寄存器等状态信息,唤醒又需要切换堆栈指针和寄存器。频繁的上下文切换(注:在内核态实现线程会引起上下文切换,而在用户态实现的线程不会引起上下文切换。现代操作系统62页),会引起性能的巨大损耗,而且还容易导致死锁。
CAS由于加锁的状态只是在一个变量上加锁而不是整个线程,不会引起上下文切换。因此会提高程序执行的效率。
CAS流程图
伪代码
/**
* oldAddr:内存地址
* expect:期望值
* target:交换值
*/
bool compareAndSwap(*oldAddr, expect, target)
{
if &o==expect
&o=target
return false
}