1. 程式人生 > >《併發程式設計》--20.無鎖的併發策略(比較交換 CAS)

《併發程式設計》--20.無鎖的併發策略(比較交換 CAS)

與鎖相比,使用比較交換(CAS)會使程式看起來更加複雜一些,但由於其非阻塞性,他對死鎖天生免疫,並且,執行緒間的相互影響也遠遠比基於鎖的方式要小。更為重要的是,使用無鎖的方式完全沒有鎖競爭帶來的系統開銷,也沒有執行緒間頻繁排程帶來的開銷,因此,他要比基於鎖的方式擁有更優越的效能。
CAS演算法的過程是這樣:他包含三個引數CAS(V,E,N)。V表示要更新的變數,E表示預期值,N表示新值。當V值等於E值值,才會將V值設為N值,如果V值和E值不同,則說明已經有其他執行緒做了更新,則當前執行緒什麼事都不做。最後,CAS會返回當前V的真實值。CAS操作是抱著樂觀的態度進行的,他總認識自己可能成功的完成操作。當多個執行緒同時使用CAS操作一個表示時,只有一個會勝出,並且更新成功,其他都會更新失敗。失敗的執行緒不會掛起。僅是被告知失敗,並且允許再次嘗試,當前頁允許失敗的執行緒放棄操作。
基於這個的原理,CAS操作及時沒有鎖,也可以發現其他執行緒對當前執行緒的干擾,並進行恰當的處理
簡單的說,CAS需要程式設計師額外給出一個期望值,也就是程式設計師認為這個變數應該是什麼樣子的。如果變數不是你理想的狀態,那就說明他已經被其他的執行緒修改了,程式設計師就需要重新讀取,再次嘗試修改
在硬體層面,大部分的現代處理器都已經支援原子化的CAS指令,在JDK1.5以後,虛擬機器便可以使用這個指令來實現併發操作和併發資料結構,並且,這種操作在虛擬機器中可說是無處不在。