java并发JUC工具包AtomicInteger原子整型语法基础
作者:字母哥哥 发布时间:2023-10-05 14:16:47
AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为java.util.concurrent.atomic
包的一部分,从Java 1.5开始引入。
1. AtomicInteger基础用法
通过下文的AtomicInteger
构造方法,可以创建一个AtomicInteger
对象,该对象的初始值默认为0。AtomicInteger
提供get和set方法,获取底层int整数值,与设置int整数值
//初始值为0的atomicInteger对象
AtomicInteger atomicInteger = new AtomicInteger();
//初始值为200的atomicInteger对象
AtomicInteger atomicInteger = new AtomicInteger(200);
int currentValue = atomicInteger.get(); //100
atomicInteger.set(2453); //现在的值是 2453
但是上面的方法,对于AtomicInteger
而言并不是它的核心内容,AtomicInteger
核心内容体现在它的原子性,我们下文介绍。
2. 什么时候需要使用AtomicInteger
我们通常在以下的两种场景下使用AtomicInteger
多线程并发场景下操作一个计数器,需要保证计数器操作的原子性。
进行数值比较,如果给定值与当前值相等,进行数值的更新操作,并实现操作的非阻塞算法。
2.1. 原子计数器场景
把AtomicInteger
作为一个计数器使用,AtomicInteger
提供了若干方法进行加法、减法的原子操作。
比如从一个map里面获取值,用get()方法,这是第一个操作;获取到值之后给这个值加上n,这是第二个操作;将进行过加法运算的值,再次放入map里面是第三个操作。所谓操作的原子性是指:在多线程并发的场景下,上面的三个操作是原子性的,也就是不可分割的。不会出现A线程get了数值,B线程同时也get到了该数值,两个线程同时为该值做运算并先后再次放入的情况,这种情况对于AtomicInteger
而言是不会出现的,AtomicInteger
操作是线程安全的、不可分割的。
addAndGet()
- 将给定的值加到当前值上,并在加法后返回新值,并保证操作的原子性。
getAndAdd()
- 将给定的值加到当前值上,并返回旧值,并保证操作的原子性。
incrementAndGet()
- 将当前值增加1,并在增加后返回新值。它相当于++i
操作,并保证操作的原子性。
getAndIncrement()
- 将当前值增加1并返回旧值。相当于++i
操作,并保证操作的原子性。
decrementAndGet()
- 将当前值减去1,并在减去后返回新值,相当于i--
操作,并保证操作的原子性。
getAndDecrement()
- 将当前值减去1,并返回旧值。它相当于 --i
操作,并保证操作的原子性。
下面是AtomicInteger原子性操作方法的例子
public class Main {
public static void main(String[] args) {
//初始值为100的atomic Integer
AtomicInteger atomicInteger = new AtomicInteger(100);
System.out.println(atomicInteger.addAndGet(2)); //加2并返回102
System.out.println(atomicInteger); //102
System.out.println(atomicInteger.getAndAdd(2)); //先获取102,再加2
System.out.println(atomicInteger); //104
System.out.println(atomicInteger.incrementAndGet()); //加1再获取105
System.out.println(atomicInteger); //105
System.out.println(atomicInteger.getAndIncrement()); //先获取105再加1
System.out.println(atomicInteger); //106
System.out.println(atomicInteger.decrementAndGet()); //减1再获取105
System.out.println(atomicInteger); //105
System.out.println(atomicInteger.getAndDecrement()); //先获取105,再减1
System.out.println(atomicInteger); //104
}
}
2.2. 数值比对及交换操作
compareAndSet操作将一个内存位置的内容与一个给定的值进行比较,只有当它们相同时,才会将该内存位置的内容修改为一个给定的新值。这个过程是以单个原子操作的方式完成的。
compareAndSet方法:如果当前值==预期值,则将值设置为给定的更新值。
boolean compareAndSet(int expect, int update)
expect
是预期值
update
是更新值
AtomicInteger compareAndSet() 方法的例子
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
public static void main(String[] args) {
//初始值为100的atomic Integer
AtomicInteger atomicInteger = new AtomicInteger(100);
//当前值100 = 预期值100,所以设置atomicInteger=110
boolean isSuccess = atomicInteger.compareAndSet(100,110);
System.out.println(isSuccess); //输出结果为true表示操作成功
//当前值110 = 预期值100?不相等,所以atomicInteger仍然等于110
isSuccess = atomicInteger.compareAndSet(100,120);
System.out.println(isSuccess); //输出结果为false表示操作失败
}
}
3. 总结
AtomicInteger
可以帮助我们在不使用synchronized同步锁的情况下,实现在多线程场景下int数值操作的线程安全,操作的原子性。并且使用AtomicInteger
来实现int数值的原子操作,远比使用synchronized同步锁效率更高。
java.util.concurrent.atomic
包不仅为我们提供了AtomicInteger
,还提供了AtomicBoolean布尔原子操作类、AtomicLong长整型布尔原子操作类、AtomicReference对象原子操作类、AtomicIntegerArray整型数组原子操作类、AtomicLongArray长整型数组原子操作类、AtomicReferenceArray对象数组原子操作类。
来源:https://zimug.blog.csdn.net/article/details/115500896


猜你喜欢
- Java 7的这个新特性改变了警告的对象。构建这些类型毕竟有破坏类型安全的风险,这总得有人知道。但 API 的用户对此是无能为力的,不管do
- 虚拟摇杆在移动游戏开发中,是很常见的需求,今天我们在Unity中,使用UGUI来实现一个简单的虚拟摇杆功能。1.打开Unity,新创建一个U
- 一、前言原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与
- 看到ios版上QQ刷新效果像水滴,然后自己也想着去实现这样的效果,这篇文章暂时没有介绍下拉刷新的效果,只是单独用一个控件来实现这样的水滴效果
- 本文将在C#中Socket同步通信的基础上,分析和研究Socket异步编程的实现方法,目的是深入了解Socket编程的基本原理,增强对网络游
- jwt简介冒泡排序:(Bubble Sort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,
- 1.导入 EasyExcel Maven包<!--easyexcel 导出excel依赖--><dependency>
- 前言:今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。简介WebView是一个基于we
- 由于springboot常用war包部署,改为cloud开发模式多端口情况下,部署反而不习惯毕竟,war包要不要项目名访问都必须放在tomc
- Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅
- 什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented P
- 1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。2)new 修饰符:在用作修饰符时,new 关键字可以显
- 1、CountDownLatch:一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。2、ThreadPoolE
- 运行环境windows 7下载地址环境下载最近开接触Android(安卓)嵌入式开发,首要问题是搭建Andoid开发环境,由于本人用的是wi
- 最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库。因此为了更好的理解公司框架,我就自己先用spring mvc实现了
- LinkedListLinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列。它的最基本存储结构是一个节点:每个节点将存储
- 本文实例为大家分享了Android开发实现抽屉菜单的具体代码,供大家参考,具体内容如下实现效果点击菜单图表即可进入抽屉代码实现1、打开app
- 本章概要文件上传@ControllerAdvice文件上传Java 中的文件上传一共涉及两个组件,一个是 CommonsMultipartR
- 准备数据data class ContactEntity( val letter: Char, &n
- 背景事情是酱紫的,阿星的上级leader负责记录信息的业务,每日预估数据量是15万左右,所以引入sharding-jdbc做分表。上级lea