AtomicInteger
是 Java 中 java.util.concurrent.atomic
包下的一个类,用于在多线程环境中进行原子操作。它通过对 int
类型数据的封装,提供了一系列能够以原子方式执行的方法,从而保证了对该整数值的操作是线程安全的。
作用:
在多线程环境中,对整数值进行诸如自增、自减等运算的操作在默认情况下是线程不安全的。AtomicInteger
的作用就是提供了一种不需要使用锁的方式来保障这些操作的线程安全性。通过使用 AtomicInteger
,可以避免因为多线程并发修改导致的数据不一致问题。
原子操作方法:
addAndGet(int delta)
: 以原子方式将给定值添加到当前值,并在添加后返回新值。getAndAdd(int delta)
: 以原子方式将给定值添加到当前值并返回旧值。incrementAndGet()
: 以原子方式将当前值递增1并在递增后返回新值。getAndIncrement()
: 以原子方式递增当前值并返回旧值。decrementAndGet()
: 原子地将当前值减1并在减量后返回新值。getAndDecrement()
: 以原子方式递减当前值并返回旧值。原子更新方法:
compareAndSet(int expect, int update)
: 如果当前值等于预期值,则以原子方式将该值设置为给定的更新值。getAndAccumulate(int factor, IntBinaryOperator operation)
: 先返回旧值,再进行计算。accumulateAndGet(int factor, IntBinaryOperator operation)
: 先计算,再返回新值。使用场景:
在需要对一个整数进行多线程安全操作的场景下,可以考虑使用 AtomicInteger
,避免使用锁带来的性能影响。在轻量级的计数器、标记等场景中,它是一个很好的选择。
底层实现:
AtomicInteger
的底层实现依赖于 CAS(Compare and Swap)操作,是一种乐观锁的实现方式。CAS 操作通过硬件指令提供了一种在多线程环境下不需要锁的原子操作,它能够判断某个位置的值是否是预期的值,如果是,则更新为新的值;如果不是,则不做任何操作。