Today we will look into AtomicInteger in Java. Atomic operations are performed in a single unit of task without interference from other operations. Atomic operations are necessity in multi-threaded environment to avoid data inconsistency.

今天,我们将研究Java中的AtomicInteger原子操作在单个任务单元中执行,而不受其他操作的干扰。 在多线程环境中,原子操作是必需的,以避免数据不一致。

原子整数 (AtomicInteger)

Let’s create a simple multi-threaded program where every thread increments the shared count variable 4 times. So if there are two threads, after they finish count value should be 8.

让我们创建一个简单的多线程程序,其中每个线程将共享count变量递增4次。 因此,如果有两个线程,则在它们完成之后, count数值应为8。

JavaAtomic.java

JavaAtomic.java

package com.journaldev.concurrency;public class JavaAtomic {public static void main(String[] args) throws InterruptedException {ProcessingThread pt = new ProcessingThread();Thread t1 = new Thread(pt, "t1");t1.start();Thread t2 = new Thread(pt, "t2");t2.start();t1.join();t2.join();System.out.println("Processing count=" + pt.getCount());}}class ProcessingThread implements Runnable {private int count;@Overridepublic void run() {for (int i = 1; i < 5; i++) {processSomething(i);count++;}}public int getCount() {return this.count;}private void processSomething(int i) {// processing some jobtry {Thread.sleep(i * 1000);} catch (InterruptedException e) {e.printStackTrace();}}}

If you will run above program, you will notice that count value varies between 5,6,7,8. The reason is because count++ is not an atomic operation. So by the time one threads read it’s value and increment it by one, other thread has read the older value leading to wrong result.

如果您将在上述程序上运行,您会注意到count数值在5,6,7,8之间变化。 原因是因为count ++不是原子操作。 因此,当一个线程读取它的值并将其递增一个时,另一线程读取了较早的值,从而导致错误的结果。

To solve this issue, we will have to make sure that increment operation on count is atomic, we can do that using Synchronization but Java 5 java.util.concurrent.atomic provides wrapper classes for int and long that can be used to achieve this atomic operation without usage of Synchronization.

为了解决这个问题,我们必须确保对count的增量操作是原子的,我们可以使用Synchronization做到这一点,但是Java 5 java.util.concurrent.atomic为int和long提供了可用于实现此atomic的包装器类。不使用同步的情况下进行操作。

Java AtomicInteger示例 (Java AtomicInteger Example)

Here is the updated program that will always output count value as 8 because AtomicInteger method incrementAndGet() atomically increments the current value by one.

这是更新后的程序,该程序将始终将计数值输出为8,因为AtomicInteger方法incrementAndGet() AtomicInteger incrementAndGet()将当前值自动增加一。

package com.journaldev.concurrency;import java.util.concurrent.atomic.AtomicInteger;public class JavaAtomic {public static void main(String[] args) throws InterruptedException {ProcessingThread pt = new ProcessingThread();Thread t1 = new Thread(pt, "t1");t1.start();Thread t2 = new Thread(pt, "t2");t2.start();t1.join();t2.join();System.out.println("Processing count=" + pt.getCount());}
}class ProcessingThread implements Runnable {private AtomicInteger count = new AtomicInteger();@Overridepublic void run() {for (int i = 1; i < 5; i++) {processSomething(i);count.incrementAndGet();}}public int getCount() {return this.count.get();}private void processSomething(int i) {// processing some jobtry {Thread.sleep(i * 1000);} catch (InterruptedException e) {e.printStackTrace();}}}

Benefits of using Concurrency classes for atomic operation is that we don’t need to worry about synchronization. This improves code readability and chance of errors are reduced. Also atomic operation concurrency classes are assumed to be more efficient that synchronization which involves locking resources.

使用并发类进行原子操作的好处是我们不必担心同步。 这样可以提高代码的可读性,并减少出错的机会。 同样,假定原子操作并发类比涉及锁定资源的同步更为有效。

翻译自: https://www.journaldev.com/1095/atomicinteger-java

Java中的AtomicInteger相关推荐

  1. java compareandset 包_在Java中,AtomicInteger compareAndSet()和synced关键字的性能如何?...

    我实现了请求实例的FIFO队列(为速度预先分配了请求对象),并开始在add方法上使用" synchronized"关键字.该方法很短(检查是否在固定大小的缓冲区中有空间,然后将值添 ...

  2. 图解Java中那18 把锁

    乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|轻量级锁|重量级锁) 锁优化技术(锁粗化.锁消除) 乐观锁和悲观锁 悲观锁 悲观锁对应 ...

  3. 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次

    结构为键值的map 这个问题可能被认为太基础了,但是在论坛中经常被问到. 在本文中,我将讨论一种仅在Map ONCE中搜索键的方法. 让我们首先来看一个例子. 假设我正在使用Map创建一个字符串频率列 ...

  4. 图解Java中的18 把锁!

    乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|轻量级锁|重量级锁) 锁优化技术(锁粗化.锁消除) 乐观锁和悲观锁 悲观锁 悲观锁对应 ...

  5. 图解Java中18把锁

    乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|轻量级锁|重量级锁) 锁优化技术(锁粗化.锁消除) 乐观锁和悲观锁 悲观锁 悲观锁对应 ...

  6. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用

    转载自 http://blog.csdn.net/bigtree_3721/article/details/51296064 JAVA 中无锁的线程安全整数 AtomicInteger,一个提供原子操 ...

  7. java中原子变量AtomicInteger等用法

    在java中的变量在++等操作是不是原子操作,分为先加一,然后赋值,从而在多线程编码时需要加上synchronizeed,为了增加易用性,java当前提供了原子变量,当前的原子变量有AtomicBoo ...

  8. java中jdk1.8,做forEach,需要把外面的变量赋值如int,long,boolean,需要外面定义原子类型的Atomic类型,AtomicBoolean,AtomicInteger

    2022-01-05 星期三 1414 by:enAn java中jdk1.8,做forEach,需要把外面的变量赋值如int,long,boolean,需要外面定义原子类型的Atomic,如:Ato ...

  9. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

最新文章

  1. JDK 13 新特性一览
  2. React组件设计实践总结05 - 状态管理
  3. 数学之美 系列一 -- 统计语言模型
  4. Java代码注释规约
  5. 1.3 使用电脑测试MC20的电话语音功能
  6. final修饰符、抽象类、接口、多态、内部类的简单小结
  7. python列表使用判断_浅谈Python数据类型判断及列表脚本操作
  8. 微信小程序——商城篇
  9. ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法
  10. ubuntu .7z解压缩
  11. dbus-glib编程2:d-feet的使用
  12. python大数据之缺省值处理
  13. matlab 直接馈通,s函数直接馈通
  14. 330pics-shell scripts-second
  15. 联通4G业务或沿用沃品牌 不推无限量套餐
  16. HTML5期末大作业:手表商城网站设计——手表商城网站模板源码(17页) web期末作业设计网页_手表商城网页设计作业成品
  17. 2021年MathorCup高校数学建模挑战赛——大数据竞赛A题
  18. 京东助手抢购-购买口罩教程
  19. Homesteading the Noosphere(开拓智域)
  20. 手臂疼,竟是它惹的祸?这些征兆你想都想不到

热门文章

  1. ASP.NET配置FCKeditor文本编辑器
  2. [转载] 机器学习 - 如何使用 Java 调取 Python、R 的训练模型?
  3. [转载] 为什么this()和super()必须是构造函数中的第一条语句?
  4. Python 模块安装失败
  5. maven项目在eclipse中debug
  6. 【译】Input Method Manager (IMM):输入法管理器
  7. AppServ 介绍
  8. np.prod() 函数计算数组元素乘积等
  9. SCI论文编辑教你如何准备SCI论文和写作
  10. python中不同进制的整数之间可以直接运算_python学习第三天总结(进制与位运算,)...