Java 多线程编程之原子类 AtomicLong(构造方法、获取与设置方法、增减方法、比较并设置方法、高级操作方法)

一、AtomicLong

  • AtomicLong 是 Java 并发包(java.util.concurrent.atomic)中的一个类,它提供了一种线程安全的整数操作方式,它有如下特点
  1. 原子性操作保证

  2. 可见性操作保证,遵循 happens-before 规则

  3. 基于 CAS 的无锁算法


二、构造方法

1、基本介绍
AtomicLong()
  1. 创建初始值为 0 的 AtomicLong
AtomicLong(long initialValue)
  1. 创建指定初始值的 AtomicLong
2、演示
AtomicLong atomicLong1 = new AtomicLong();

AtomicLong atomicLong2 = new AtomicLong(10);

三、获取与设置方法

1、基本介绍
long get()
  1. 获取当前值
void set(long newValue)
  1. 设置新值
long getAndSet(long newValue)
  1. 获取当前值并设置新值
2、演示
  1. get 方法与 set 方法
AtomicLong atomicLong = new AtomicLong(10);

System.out.println(atomicLong.get());

atomicLong.set(20);

System.out.println(atomicLong.get());
# 输出结果

10
20
  1. 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. 获取当前值然后加 1
long incrementAndGet()
  1. 加 1 然后获取新值
long getAndDecrement()
  1. 获取当前值然后减 1
long decrementAndGet()
  1. 减 1 然后获取新值
long getAndAdd(long delta)
  1. 获取当前值然后加上指定值
long addAndGet(long delta)
  1. 加上指定值然后获取新值
2、演示
  1. getAndIncrement 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.getAndIncrement();

System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

10
11
  1. incrementAndGet 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.incrementAndGet();

System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

11
11
  1. getAndDecrement 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.getAndDecrement();

System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

10
9
  1. decrementAndGet 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.decrementAndGet();

System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

9
9
  1. getAndAdd 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.getAndAdd(10);

System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

10
20
  1. 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)
  1. 更新当前值并返回更新后的值,将函数的返回值作为新值
long getAndUpdate(LongUnaryOperator updateFunction)
  1. 获取当前值然后更新,将函数的返回值作为新值
long accumulateAndGet(long x, LongBinaryOperator accumulatorFunction)
  1. 给定值与当前值合并,并返回合并后的结果,将函数的返回值作为新值
long getAndAccumulate(long x, LongBinaryOperator accumulatorFunction)
  1. 获取当前值,然后将给定值与当前值合并,将函数的返回值作为新值
2、演示
  1. updateAndGet 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.updateAndGet(value -> value * 2);
System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

20
20
  1. getAndUpdate 方法
AtomicLong atomicLong = new AtomicLong(10);

long result = atomicLong.getAndUpdate(value -> value * 2);
System.out.println(result);
System.out.println(atomicLong.get());
# 输出结果

10
20
  1. 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
  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值