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
参考博客: 性能