TOP 带着问题看源码
- AtomicInteger 是怎么做到线程安全的
- AtomicInteger 是怎么实现自增的
1. 基本介绍
AtomicInteger 扩展了 Number,适用于基于数字的处理,并提供了如原子递增等,适合一些计数场景
1 | private static final Unsafe unsafe = Unsafe.getUnsafe(); |
可以看到 value 是采用 volatile 修饰的,并通过 Unsafe 类获取 value 的偏移量,方便后续使用 CAS 操作
2. 自增 & 自减
1 | // 获取 & 自增 |
AtomicInteger 提供了自增/自减的两个场景方法,一个返回旧值,一个返回新增/自减后的。
实际都是通过Unsafe 的 getAndAddInt 方法来实现的,可以看到实际上 getAndAddInt 就是一个 cas + 自旋操作来实现。
1 | public final int getAndAddInt(Object var1, long var2, int var4) { |
回到 TOP 问题1 2 可以看到实际是采用 CAS + 自旋来实现线程安全的自增