CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInteger?()

Compare And Swap,比较交换。可以看到 synchronized 可以保证代码块原子性,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile 不能保证原子性,只能在某些场合下使用。所以可以通过 CAS 来进行同步,保证原子性。

我们在读 Concurrent 包下的类的源码时,发现无论是 ReentrantLock 内部的 AQS,还是各种 Atomic 开头的原子类,内部都应用到了 CAS。

在 CAS 中有三个参数:内存值 V、旧的预期值 A、要更新的值 B ,当且仅当内存值 V 的值等于旧的预期值 A 时,才会将内存值 V 的值修改为 B,否则什么都不干。

CAS 可以保证一次的读-改-写操作是原子操作。

在多线程环境下,int 类型的自增操作不是原子的,线程不安全,可以使用 AtomicInteger 代替。

————————

Compare And Swap,比较交换。可以看到 synchronized 可以保证代码块原子性,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile 不能保证原子性,只能在某些场合下使用。所以可以通过 CAS 来进行同步,保证原子性。

我们在读 Concurrent 包下的类的源码时,发现无论是 ReentrantLock 内部的 AQS,还是各种 Atomic 开头的原子类,内部都应用到了 CAS。

在 CAS 中有三个参数:内存值 V、旧的预期值 A、要更新的值 B ,当且仅当内存值 V 的值等于旧的预期值 A 时,才会将内存值 V 的值修改为 B,否则什么都不干。

CAS 可以保证一次的读-改-写操作是原子操作。

在多线程环境下,int 类型的自增操作不是原子的,线程不安全,可以使用 AtomicInteger 代替。