当前位置: 首页 > news >正文

Java 多线程编程之原子类 AtomicInteger(构造方法、常用方法、高级操作方法)

一、AtomicInteger

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

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

  3. 基于 CAS 的无锁算法


二、构造方法

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

AtomicInteger atomicInteger2 = new AtomicInteger(10);

三、常用方法

1、基本介绍
int get()
  1. 获取当前值
void set(int newValue)
  1. 设置新值
int getAndSet(int newValue)
  1. 获取当前值并设置新值
int getAndIncrement()
  1. 获取当前值然后加 1
int incrementAndGet()
  1. 加 1 然后获取新值
int getAndDecrement()
  1. 获取当前值然后减 1
int decrementAndGet()
  1. 减 1 然后获取新值
int getAndAdd(int delta)
  1. 获取当前值然后加上指定值
int addAndGet(int delta)
  1. 加上指定值然后获取新值
2、演示
  1. get 方法与 set 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

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

atomicInteger.set(20);

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

10
20
  1. getAndSet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

int result = atomicInteger.getAndSet(20);

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

10
20
  1. getAndIncrement 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

int result = atomicInteger.getAndIncrement();

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

10
11
  1. incrementAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

int result = atomicInteger.incrementAndGet();

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

11
11
  1. getAndDecrement 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

int result = atomicInteger.getAndDecrement();

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

10
9
  1. decrementAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

int result = atomicInteger.decrementAndGet();

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

9
9
  1. getAndAdd 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

int result = atomicInteger.getAndAdd(5);

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

10
15
  1. 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)
  1. 如果当前值等于 expectedValue,则允许设置为 newValue,如果设置,返回 true,不过不设置,返回 false
int updateAndGet(IntUnaryOperator updateFunction)
  1. 更新当前值并返回更新后的值,将函数的返回值作为新值
int getAndUpdate(IntUnaryOperator updateFunction)
  1. 获取当前值然后更新,将函数的返回值作为新值
int accumulateAndGet(int x, IntBinaryOperator accumulatorFunction)
  1. 给定值与当前值合并,并返回合并后的结果,将函数的返回值作为新值
int getAndAccumulate(int x, IntBinaryOperator accumulatorFunction)
  1. 获取当前值,然后将给定值与当前值合并,将函数的返回值作为新值
2、演示
  1. 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
  1. updateAndGet 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

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

20
20
  1. getAndUpdate 方法
AtomicInteger atomicInteger = new AtomicInteger(10);

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

10
20
  1. 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
  1. 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

相关文章:

  • x265 编码参数 maxNumReferences 详细解析与实验
  • 散户使用算法交易怎么做?
  • 集中趋势描述
  • 成都国贸·人居|启樾天玺先锋艺术示范区盛大亮相
  • C++笔记-vector
  • 高光谱相机:温室盆栽高通量植物表型光谱成像研究
  • 安全编码课程 实验7 并发
  • 如何用服务预约让客单价提升20%?
  • 图像预处理-边缘填充,透视变换和色彩空间基础
  • go中我遇到的问题总结
  • 7.5 使用MobileNet v3进行图像的区分
  • 阿里滑块 231 231纯算 水果滑块 拼图 1688滑块 某宝 大麦滑块 阿里231 验证码
  • 【CHNS】 各个文件,数据信息备注
  • C++ (new和delete运算符,链接库,面向对象与面向过程)
  • SecProxy - 自动化安全协同平台
  • [reinforcement learning] 是什么 | 应用场景 | Andrew Barto and Richard Sutton
  • ros2_01
  • Qt QML - qmldir使用方法详解
  • Leetcode——137 260找出只出现一次的数
  • 【密码学——基础理论与应用】李子臣编著 第六章 祖冲之序列密码 课后习题
  • 跑马,一场对机器人的长测试
  • 观察|中日航线加速扩容,航空公司如何抓住机会?
  • 重庆警方通报“货车轮胎滚进服务区致人死亡”:正进一步调查
  • 42岁北京大学科学技术与医学史系副教授陈昊逝世
  • 特朗普称美乌矿产协议将于24日签署
  • 雅生活服务:向雅居乐收购两家环保公司,总价约6060万元