当前位置:网站首页>Detailed explanation of AtomicInteger
Detailed explanation of AtomicInteger
2022-08-02 21:04:00 【i attack siege lion】
一、什么是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操作.
边栏推荐
猜你喜欢

Playing in the cloud | The key technology of Tianyi cloud object storage ZOS high availability is revealed

固态硬盘接口类型介绍

数据治理:数据集成和应用模式的演进

通信大学生走向岗位,哪些技能最实用?

LeetCode 2353. 设计食物评分系统(sortedcontainers)

NIO基础之三大组件

HDF驱动框架的API(3)

天翼云4.0分布式云赋能千行百业数字化转型

How to build a quasi-real-time data warehouse?

How can services start smoothly under tens of millions of QPS
随机推荐
What skills are the most practical for college students in communications?
LeetCode 2333. 最小差值平方和(贪心)
从技术全景到场景实战,透析「窄带高清」的演进突破
HDF驱动框架的API(2)
LeetCode 1947. 最大兼容性评分和(状态枚举DP)
Win11dll文件缺失怎么修复?Win11系统dll文件丢失的解决方法
在线文档Sheet技术解析
Data Governance: The Evolution of Data Integration and Application Patterns
CUDA+Pycharm-gpu版本+Anaconda安装
记一次 .NET 某工控自动化控制系统 卡死分析
手机银行体验性测试:如何获取用户真实感受
千万级QPS下服务如何才能平滑启动
洛谷P4316 绿豆蛙的归宿
Technical life | How to draw a big picture of business
注释
洛谷P1966 火柴排队
LeetCode 2353. 设计食物评分系统(sortedcontainers)
如何减轻企业账户被劫持的攻击?
Win11主题下载一直转圈怎么办?Win11主题下载一直转圈的解决方法
MySQL基本查询和运算符