结论
i++ 不是原子性的!!!
理由
如果你学习过 C 或者Java 等基础语法,那么一定知道
i++ 和 ++i 都不是一步完成的,只不过写法简化了而已
i++ 操作在大多数编程语言中,包括 Java 和 C/C++ 等,并不是原子性的。这个操作实际上包含了三个不可分割的步骤:
读取当前值。
将该值加一
将新值赋值(也就是写回内存)
衍生问题
多线程操作i++ 的结果,结果最低 i 的值和单线程的结果一致(相当于假使了所有现场大家每次操作的时机和赋值都是一摸一样的),最大值相当于所有线程的执行结果总和,即 线程数 * 单线程的结果。
为了解决多线程的这种累加问题,可以使用原子类java.util.concurrent.atomic 包下的原子类,如 AtomicInteger 来实现线程安全的递增操作。
AtomicInteger 提供了诸如 getAndIncrement() 方法,该方法保证了递增操作的原子性。