java 原子操作类_Java原子操作类AtomicInteger应用场景

Java中有那么一些类,是以Atomic开头的。这一系列的类我们称之为原子操作类。以最简单的类AtomicInteger为例。它相当于一个int变量,我们执行Int的 i++ 的时候并不是一个原子操作。而使用AtomicInteger的incrementAndGet却能保证原子操作。具体的类如下:

5f4d5e9072f1cff1b47d595073e35666.png

闲话不多说,还是用实例说话吧。

问题:现在有2个线程,分别将全局整型变量 i 进行加1。每个线程执行5000次。按照传统的int使用方式,代码如下:

private static int m = 0;

public static void main(String[] args) throws InterruptedException {

CountDownLatch cdl = new CountDownLatch(2);

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

for (int j = 0; j < 5000; j++) {

m++;

}

cdl.countDown();

}

});

Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

for (int j = 0; j < 5000; j++) {

m++;

}

cdl.countDown();

}

});

t1.start();

t2.start();

cdl.await();

System.out.println("result=" + m);

}

最后我们执行上面的代码,结果有可能是10000,但是大多数时候不是10000,而是随机的一些数字。这里的问题就在于 m++,如果我们在 m++的时候加上关键字synchronized也能解决该并发问题。但是synchronized过于沉重。于是我们可以考虑使用原子操作类AtomicInteger来实现。具体实现代码如下:

public static void main(String[] args) throws InterruptedException {

CountDownLatch cdl = new CountDownLatch(2);

AtomicInteger i = new AtomicInteger(0);

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

for (int j = 0; j < 5000; j++) {

i.incrementAndGet();

}

cdl.countDown();

}

});

Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

for (int j = 0; j < 5000; j++) {

i.incrementAndGet();

}

cdl.countDown();

}

});

t1.start();

t2.start();

cdl.await();

System.out.println("result=" + i.get());

}

现在我们无论执行多少次,结果总是10000。

说明:

m++并不是一个原子操作,而incrementAndGet却是原子操作方法

Java 并发系列之九:java 原子操作类Atomic(13个)

1. 原子更新基本类型类 2. 原子更新数组 3. 原子更新引用 4. 原子更新属性 5. txt java 原子操作类Atomic 概述 java.util.concurrent.atomic里的原 ...

Java原子操作类汇总

当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同.比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2.这是 ...

原子操作类AtomicInteger详解

为什么需要AtomicInteger原子操作类?对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的.num++解析为num=num+1,明显,这个操作不 ...

Java原子操作类,你知道多少&quest;

原子操作类简介 由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案. 实际上,在J.U.C下的atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去 更新基 ...

Java原子操作类汇总(2)

当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同.比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2.这是 ...

JAVA 原子操作类

上文中,guava代码中就用到了,在这里再专门捋一下 部分内容源自: https://www.jianshu.com/p/712681f5aecd https://www.yiibai.com/jav ...

java并发编程:线程安全管理类--原子操作类--AtomicInteger

在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger

并发编程-concurrent指南-原子操作类-AtomicInteger

在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger

【多线程与并发】Java中的12个原子操作类

从JDK1.5开始,Java提供了java.util.concurrent.atomic包,该包中的原子操作类提供了一种使用简单.性能高效(使用CAS操作,无需加锁).线程安全地更新一个变量的方式. ...

随机推荐

Oracle常用SQL函数整理

--返回ASCII码select  ASCII('A') "A的ASCII码" ,ASCII('a') "a的ASSCII码" from dual ; --反向 ...

ASP&period;NET Core – 2300&percnt; More Requests Served Per Second

http://www.ageofascent.com/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/ ASP.NET Core – Excee ...

Run python as a daemon process

I am using `&`: why isn't the process running in the background?     No problem. We won't show y ...

SAP中获取当前用户相关信息的两个函数

函数名:TH_USER_LIST作用:可以得到SM04界面显示样式的表. 函数名:TH_USER_INFO作用:可以得到当前特定用户的机器名.当前活动窗口数.IP地址等信息

2014 牡丹江现场赛 A&period;Average Score(zoj 3819) 解题报告

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5373 题目意思: 有两个class:A 和 B,Bob 在 Clas ...

Winform自定义分页控件的实现

实现效果 有点丑陋 但是功能是没问题的 测试过 实现思路 先创建一个用户控件 代码实现 public partial class PagerControl : UserControl { ; /// ...

WinFom基本属性

常用窗体属性: AutoSroll:如果窗体内容超出了窗体范围,自动出现滚动条.默认是false. AutoSize:调节窗口大小时,保证使窗体内的内容必须全部显示出来. Location:控件左上角 ...

OGRE插件设计-Texture与GLTexture

背景: 学习OGRE,在OGRE中 Core是最小的精简逻辑集合,而真正的功能则需要插件来实现,但是作为插件应该与Core保持最小的连接,同时Core不会调用插件的接口,而动态链接库又不能直接把类连接 ...

LayoutDemo

package swing.ui; import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.JButt ...

slurm-16&period;05&period;3任务调度系统部署与测试&lpar;1&rpar;

1.概述2.同步节点时间3.下载并解压文件4.编译安装munge-0.5.125.配置munge6.编译安装slurm-16.05.37.配置slurm8.配置MySQL数据库环境9.启动slur ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值