AtomicInteger的实现方式及场景

👌AtomicInteger的实现方式及场景

题目详细答案

AtomicInteger是 Java 中提供的一种用于在多线程环境下进行原子操作的类。它属于java.util.concurrent.atomic包,提供了一种无锁的线程安全方式来操作整数值。AtomicInteger基于底层的硬件原子操作(例如 CAS 操作)实现,确保在多线程环境中进行高效的数值更新。

AtomicInteger的实现方式

AtomicInteger通过使用 CAS(Compare-And-Swap)操作来实现原子性。CAS 是一种硬件级别的原子操作,能够确保在多线程环境下对变量进行无锁的更新。

  1. 底层变量:使用volatile关键字声明一个int类型的变量,确保变量的可见性。
  2. CAS 操作:通过Unsafe类提供的原子操作方法来实现无锁更新。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
private final AtomicInteger atomicInteger = new AtomicInteger(0);

public void increment() {
atomicInteger.incrementAndGet();
}

public int getValue() {
return atomicInteger.get();
}

public static void main(String[] args) {
AtomicIntegerExample example = new AtomicIntegerExample();

Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
example.increment();
}
};

Thread t1 = new Thread(task);
Thread t2 = new Thread(task);

t1.start();
t2.start();

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Final value: " + example.getValue());
}
}

在这个示例中,我们使用AtomicInteger实现了一个简单的计数器,并在两个线程中并发地对计数器进行自增操作。最终的结果是线程安全的。

AtomicInteger的主要方法

get(): 获取当前值。

set(int newValue): 设置当前值。

getAndSet(int newValue): 获取当前值,并设置为新值。

compareAndSet(int expect, int update): 如果当前值等于预期值,则将其设置为新值。

getAndIncrement(): 获取当前值,并自增。

incrementAndGet(): 自增,并获取自增后的值。

getAndDecrement(): 获取当前值,并自减。

decrementAndGet(): 自减,并获取自减后的值。

getAndAdd(int delta): 获取当前值,并加上指定的值。

addAndGet(int delta): 加上指定的值,并获取加后的值。

使用场景

  1. 计数器:在多线程环境中用于计数,例如统计请求数、用户数等。
  2. 序列生成器:生成全局唯一的序列号。
  3. 并发控制:用于实现并发控制机制,如限流器、资源池等。
  4. 状态管理:用于管理多线程环境下的共享状态,确保状态更新的原子性。
  5. 锁的替代:在某些情况下,可以使用AtomicInteger来替代传统的锁机制,减少锁竞争,提高性能。

优缺点

优点

  1. 高效:基于硬件级别的原子操作,性能高于使用锁的方式。
  2. 无锁:避免了锁竞争和上下文切换,减少了开销。
  3. 简单易用:提供了丰富的方法,简化了并发编程。

缺点

  1. 适用范围有限:适用于简单的数值更新操作,对于复杂的数据结构或操作,仍需要使用锁。
  2. CAS 操作失败重试:在高并发情况下,CAS 操作可能会频繁失败,需要多次重试,影响性能。

原文: https://www.yuque.com/jingdianjichi/xyxdsi/vpbqzzcb5t0ur8hm

 wechat
天生我才必有用