互斥锁:锁机制是同一时刻只允许一个线程执行一个关键部分的代码。

无锁编程:

无锁编程:不使用锁的情况下实现多线程之间对变量同步和访问的一种程序设计实现方案。

无锁编程具体使用和考虑到的技术方法包括:

  1. 原子操作(atomic operations)
  2. 内存栅栏(memory barriers)
  3. 内存顺序冲突(memory order)
  4. 指令序列一致性(consistency)
  5. ABA 问题

原子操作

最基础最重要的是操作的原子性或说原子操作。原子操作可以理解为在执行完毕之前不会被任何其它任务或事件中断的一系列操作。原子操作是非阻塞编程最核心基本的部分,没有原子操作的话,操作会因为中断异常等各种原因引起数据状态的不一致从而影响到程序的正确。

CAS

最常用的原子操作又是 COMPARE AND SWAP (CAS),几乎所有的 CPU 指令集都支持 CAS 的原子操作。

CAS 操作行为是比较某个内存地址处的内容是否和期望值一致,如果一致则将该地址处的数值替换为一个新值。CAS 能够操作的位数越多,使用它来实现锁无关的数据结构就越容易。

CAS 操作具体的实现原理主要是两种方式:总线锁定和缓存锁定。

ABA的问题

线程 a 先读取了要对比的值v后,被线程 b 抢占了,线程 b 对 v 进行了修改后又改会 v 原来的值,线程a继续运行执行 CAS 操作的时候,无法判断出 v 的值被改过又改回来。


参考: