Java 多线程编程之原子类 AtomicInteger(构造方法、常用方法、高级操作方法)
一、AtomicInteger
- AtomicInteger 是 Java 并发包(
java.util.concurrent.atomic
)中的一个类,它提供了一种线程安全的整数操作方式,它有如下特点
-
原子性操作保证
-
可见性操作保证,遵循 happens-before 规则
-
基于 CAS 的无锁算法
二、构造方法
1、基本介绍
AtomicInteger()
- 创建初始值为 0 的 AtomicInteger
AtomicInteger(int initialValue)
- 创建指定初始值的 AtomicInteger
2、演示
AtomicInteger atomicInteger1 = new AtomicInteger();
AtomicInteger atomicInteger2 = new AtomicInteger(10);
三、常用方法
1、基本介绍
int get()
- 获取当前值
void set(int newValue)
- 设置新值
int getAndSet(int newValue)
- 获取当前值并设置新值
int getAndIncrement()
- 获取当前值然后加 1
int incrementAndGet()
- 加 1 然后获取新值
int getAndDecrement()
- 获取当前值然后减 1
int decrementAndGet()
- 减 1 然后获取新值
int getAndAdd(int delta)
- 获取当前值然后加上指定值
int addAndGet(int delta)
- 加上指定值然后获取新值
2、演示
- get 方法与 set 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
System.out.println(atomicInteger.get());
atomicInteger.set(20);
System.out.println(atomicInteger.get());
# 输出结果
10
20
- getAndSet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.getAndSet(20);
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
10
20
- getAndIncrement 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.getAndIncrement();
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
10
11
- incrementAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.incrementAndGet();
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
11
11
- getAndDecrement 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.getAndDecrement();
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
10
9
- decrementAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.decrementAndGet();
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
9
9
- getAndAdd 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.getAndAdd(5);
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
10
15
- addAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.addAndGet(5);
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
15
15
四、高级操作方法
1、基本介绍
boolean compareAndSet(int expectedValue, int newValue)
- 如果当前值等于 expectedValue,则允许设置为 newValue,如果设置,返回 true,不过不设置,返回 false
int updateAndGet(IntUnaryOperator updateFunction)
- 更新当前值并返回更新后的值,将函数的返回值作为新值
int getAndUpdate(IntUnaryOperator updateFunction)
- 获取当前值然后更新,将函数的返回值作为新值
int accumulateAndGet(int x, IntBinaryOperator accumulatorFunction)
- 给定值与当前值合并,并返回合并后的结果,将函数的返回值作为新值
int getAndAccumulate(int x, IntBinaryOperator accumulatorFunction)
- 获取当前值,然后将给定值与当前值合并,将函数的返回值作为新值
2、演示
- compareAndSet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
boolean result1 = atomicInteger.compareAndSet(20, 30);
System.out.println(result1);
System.out.println(atomicInteger.get());
boolean result2 = atomicInteger.compareAndSet(10, 30);
System.out.println(result2);
System.out.println(atomicInteger.get());
# 输出结果
false
10
true
30
- updateAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.updateAndGet(value -> value * 2);
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
20
20
- getAndUpdate 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.getAndUpdate(value -> value * 2);
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
10
20
- accumulateAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.accumulateAndGet(2, (x, y) -> {
System.out.println("x: " + x);
System.out.println("y: " + y);
return x * y;
});
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
x: 10
y: 2
20
20
- getAndAccumulate 方法
AtomicInteger atomicInteger = new AtomicInteger(10);
int result = atomicInteger.getAndAccumulate(2, (x, y) -> {
System.out.println("x: " + x);
System.out.println("y: " + y);
return x * y;
});
System.out.println(result);
System.out.println(atomicInteger.get());
# 输出结果
x: 10
y: 2
10
20