CAS簡(jiǎn)介
CAS指的是Compare And Swap或者Compare And Set也即是比較并交換枕屉。CAS是原子操作必指,比較內(nèi)存地址的當(dāng)前值和期望值保證了交換操作基于最新值。如果其他線程修改了內(nèi)存地址的值并且與期望值不同則造成CAS操作失敗评疗。
CAS是一種無鎖(LOCK-FREE)操作(注:表面上看CAS是不加鎖實(shí)際上在操作系統(tǒng)底層還是需要加鎖藐石,因?yàn)橐_保取值洲炊,比較飘哨,交換的原子性)胚想。
LOCK vs CAS
LOCK操作會(huì)陷入內(nèi)核態(tài)也即是操作系統(tǒng)管理,對(duì)資源的加鎖往往會(huì)引起其它線程的掛起操作芽隆。掛起需要保存線程的堆棧指針和寄存器等狀態(tài)信息浊服,喚醒又需要切換堆棧指針和寄存器统屈。頻繁的上下文切換(注:在內(nèi)核態(tài)實(shí)現(xiàn)線程會(huì)引起上下文切換,而在用戶態(tài)實(shí)現(xiàn)的線程不會(huì)引起上下文切換⊙捞桑現(xiàn)代操作系統(tǒng)62頁(yè))愁憔,會(huì)引起性能的巨大損耗,而且還容易導(dǎo)致死鎖孽拷。
CAS由于加鎖的狀態(tài)只是在一個(gè)變量上加鎖而不是整個(gè)線程吨掌,不會(huì)引起上下文切換。因此會(huì)提高程序執(zhí)行的效率乓搬。
CAS流程圖
偽代碼
/**
* oldAddr:內(nèi)存地址
* expect:期望值
* target:交換值
*/
bool compareAndSwap(*oldAddr, expect, target)
{
if &o==expect
&o=target
return false
}