天天看點

《并發程式設計》--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以後,虛拟機便可以使用這個指令來實作并發操作和并發資料結構,并且,這種操作在虛拟機中可說是無處不在。

繼續閱讀