**原子操作不可分割地完成 —— 没有其他线程会看到半完成的状态;内存可见性指一个线程的写入是否被另一个线程看到;内存屏障强制排序,使那些写入变得可见。**锁并不是唯一要关心的 —— 内存模型也是。
原子性
一个原子操作(例如 fetch_add、compare-and-swap)作为一个不可分割的步骤执行,因此没有竞态能把它拆开。硬件和语言为计数器和标志位提供原子操作,无需一把完整的锁。
java
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet(); // 原子的读-改-写,无需锁
可见性与重排序
现代 CPU 和编译器会把值缓存在寄存器里,并为提速而重排指令。因此一个线程的写入可能滞留在存储缓冲区(store buffer)中,对其他线程不可见,而操作也可能看起来乱序。
