CAS( compare and swap) 原子操做,保證了若是須要更新的地址沒有被其餘進程(線程)改動過,那麼它能夠安全的寫入。而這也是咱們對於某個數據或者數據結構加鎖要保護的內容,保證讀寫的一致性,不出現dirty data。可在循環中不斷執行CAS,若是共享變量沒有改變,那麼swap,在當前環境中寫入,不然繼續do-while的Retry-Loop。html
1 int compare_and_swap (int* reg, int oldval, int newval) { 2 ATOMIC(); 3 int old_reg_val = *reg; 4 if (old_reg_val == oldval) 5 *reg = newval; 6 END_ATOMIC(); 7 return old_reg_val; 8 }
ABA問題最容易發生在lock free算法中的,地址被重用的狀況算法
無鎖至關於「鎖」的粒度變小了,主要是「鎖」HEAD和TAIL這兩個關鍵資源。而不是整個數據結構。
shell
無鎖與自旋鎖比較:緩存
無鎖安全
自旋鎖數據結構
自旋鎖與互斥鎖比較:併發
1. 自旋鎖不會使線程狀態發生切換,一直處於用戶態,即線程一直都是active的;不會使線程進入阻塞狀態,減小了沒必要要的上下文切換,執行速度快oop
2. 互斥鎖在獲取不到鎖的時候會進入阻塞狀態,從而進入內核態,當獲取到鎖的時候須要從內核態恢復,須要線程上下文切換。 (線程被阻塞後便進入內核(Linux)調度狀態,這個會致使系統在用戶態與內核態之間來回切換,嚴重影響鎖的性能)post
參考博客: 性能