当前位置:网站首页>AtomicInteger详解
AtomicInteger详解
2022-08-02 17:57:00 【i进击的攻城狮】
一、什么是AtomicInteger
AtomicInteger类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作。AtomicInteger它不能当作Integer来使用
从JAVA 1.5开始,AtomicInteger 属于java.util.concurrent.atomic 包下的一个类
。
二、AtomicInteger的作用
在Java中的运算操作,例如自增或自减,在多线程环境下就是线程不安全的。num++解析为num=num+1,Java程序会把算式分为3个操作,获取值,计算值,赋予值,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。
一个线程计算出值后,还未重新给变量赋值,另一个线程有来读取到这个值,就会造成线程不安全的问题。
想让线程安全,往往可能需要通过加锁的方式去保证线程安全,但是,加锁对性能会有很大的影响。
而AtomicInteger原子类型就是让程序在不加锁的时候也能保障线程安全,案例如下:
static int b =0;
public static void main(String[] args) throws InterruptedException {
AtomicInteger a = new AtomicInteger(0);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
a.incrementAndGet();
b++;
}
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
a.incrementAndGet();
b++;
}
}
});
t2.start();
Thread.sleep(1000);
System.out.println("a="+a);
System.out.println("b="+b);
}
输出结果:
根据结果可见,使用AtomicInteger在多线程进行自增运算的时候,是线程安全的,而普通的int在自增的时候则是线程不安全的。
incrementAndGet()方法,是AtomicInteger的自增方法,会让AtomicInteger的值+1。
三、 原子方式执行加法和减法操作的方法
- addAndGet()- 以原子方式将给定值添加到当前值,并在添加后返回新值。
- getAndAdd() - 以原子方式将给定值添加到当前值并返回旧值。
- incrementAndGet()- 以原子方式将当前值递增1并在递增后返回新值。它相当于i ++操作。
- getAndIncrement() - 以原子方式递增当前值并返回旧值。它相当于++ i操作。
- decrementAndGet()- 原子地将当前值减1并在减量后返回新值。它等同于i-操作。
- getAndDecrement() - 以原子方式递减当前值并返回旧值。它相当于-i操作。
边栏推荐
猜你喜欢
随机推荐
千万级QPS下服务如何才能平滑启动
Smart Microelectronics Releases Low-Power MM32L0130 Series MCU Products
KunlunBase 1.0 发布了!
Go 语言快速入门指南:第二篇 变量与常量
魔豹联盟:佛萨奇2.0dapp系统开发模式详情
codeforces:E. Add Modulo 10【状态压缩 + 找规律】
技术人生 | 如何设定业务目标
E-Surfing Cloud 4.0 Distributed Cloud Enables Digital Transformation of Thousands of Industries
redis summary_distributed cache
golang刷leetcode 经典(4) 实现跳表
LeetCode 1947. 最大兼容性评分和(状态枚举DP)
MySQL命令(命令行方式,而非图形界面方式)
查看数据库数据量大小,占用磁盘大小
How to ensure the security of smart factories?
Remember the stuck analysis of an industrial automation control system in .NET
Go 语言快速入门指南: 介绍及安装
golang刷leetcode 经典(5)设计哈希集合
载20(S)-人参皂苷/细胞穿膜肽-单克隆抗体-载丝裂霉素白蛋白纳米微球的制备
MySQL LIKE – 语法和用法示例教程
Ubuntu系统下用docker安装oracle









