AtomicInteger
常用于以下情况:
-
计数器:当你需要跨多个线程安全地增加或减少计数时,如统计在线用户数、完成任务的数量等。
-
状态标记:用作线程安全的状态标记,例如标记某个任务是否已完成,或者跟踪某个资源的使用状态。
-
生成唯一序列号:在多线程环境中生成唯一序列号或ID,保证每次生成的值都是唯一的。
-
并发控制:用于控制多线程之间的并发执行,比如限流算法中限制在特定时间内的请求数量。
-
无锁算法的组成部分:在实现一些无锁数据结构和算法时作为基础组件,因为它提供了无需锁定的线程安全操作。
使用AtomicInteger
可以简化代码并提高性能,特别是在高并发场景下,相比于使用锁(如synchronized
或java.util.concurrent.locks.Lock
)来说,AtomicInteger
可以减少线程阻塞的概率,提高系统的吞吐率。
AtomicIntger自带的方法
AtomicInteger
类提供了一系列用于原子操作的方法,这些方法可以在没有锁的情况下保证多线程环境中的线程安全。以下是一些常用的AtomicInteger
方法及其简要说明:
基本操作
get()
:返回当前的值。set(int newValue)
:设置为给定的值。lazySet(int newValue)
:最终设置为给定的值,使用lazySet
可能比set
更高效,但不能保证立即对其他线程可见。getAndSet(int newValue)
:自动设置为给定的值,并返回旧值。
原子更新操作
incrementAndGet()
:原子地将当前值加1,然后返回更新后的值。getAndIncrement()
:原子地将当前值加1,然后返回旧值。decrementAndGet()
:原子地将当前值减1,然后返回更新后的值。getAndDecrement()
:原子地将当前值减1,然后返回旧值。addAndGet(int delta)
:原子地将给定值与当前值相加,然后返回更新后的值。getAndAdd(int delta)
:原子地将给定值与当前值相加,然后返回旧值。
CAS(Compare-And-Swap)相关操作
compareAndSet(int expect, int update)
:如果当前值== expect
,则原子地将该值设置为update
。成功时返回true
,否则返回false
。weakCompareAndSet(int expect, int update)
:可能会比compareAndSet
更快,但可能需要重试。它也是基于CAS操作,如果当前值== expect
,则尝试将该值设置为update
。
高级累加器操作
getAndUpdate(IntUnaryOperator updateFunction)
:原子地更新当前值,更新函数依赖于当前值。返回旧值。updateAndGet(IntUnaryOperator updateFunction)
:原子地更新当前值,更新函数依赖于当前值。返回更新后的值。getAndAccumulate(int x, IntBinaryOperator accumulatorFunction)
:原子地将给定值x
与当前值进行累加操作(通过accumulatorFunction
定义),返回旧值。accumulateAndGet(int x, IntBinaryOperator accumulatorFunction)
:原子地将给定值x
与当前值进行累加操作(通过accumulatorFunction
定义),返回更新后的值。
这些方法使得AtomicInteger
成为在并发编程中实现计数器、生成器、累加器等无锁算法的理想选择。通过使用这些原子操作,可以在不使用synchronized
或java.util.concurrent.locks.Lock
的情况下,安全地在多线程环境中操作单个变量。