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