2021-06-21

java并发编程JUC第十二篇:AtomicInteger原子整型

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();   //100atomicInteger.set(2453);      //现在的值是 2453

但是上面的方法,对于AtomicInteger而言并不是它的核心内容,AtomicInteger核心内容体现在它的原子性,我们下文介绍。

2. 什么时候需要使用AtomicInteger

我们通常在以下的两种场景下使用AtomicInteger

  1. 多线程并发场景下操作一个计数器,需要保证计数器操作的原子性。
  2. 进行数值比较,如果给定值与当前值相等,进行数值的更新操作,并实现操作的非阻塞算法。

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对象数组原子操作类。

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端分离RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》








原文转载:http://www.shaoqun.com/a/818647.html

跨境电商:https://www.ikjzd.com/

宝宝我们换个姿势楼梯间 每走走一步重重地撞一下:http://lady.shaoqun.com/a/248161.html

邮乐网:https://www.ikjzd.com/w/1776

口述:夫妻交换的性爱故事(3/3):http://www.30bags.com/m/a/249635.html

强壮的公么征服我厨房 公又粗又长又大又深好爽:http://lady.shaoqun.com/m/a/247959.html


AtomicInteger类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger作为java.util.concurrent.atomic包的一部分,从Java1.5开始引入。1.AtomicInteger基础用法通过下文的AtomicInteger构造方法,可以创建一个AtomicInteger对象,该对象的初始值默认为0。AtomicInteger提供get和s
疫情暴击持续数月卖家是如何挽救自己业务的?疫情下卖家自救指南:https://www.ikjzd.com/articles/121752
来万州千万别去吃烤鱼:这几道怪异的小吃,才是老万州人的心头爱:http://www.30bags.com/a/225606.html
老公生育有问题 我和旧爱刚好有了孩子:http://lady.shaoqun.com/m/a/43326.html
口述爱爱好爽细节过程 男朋友一晚上要我四五次:http://lady.shaoqun.com/m/a/248168.html
深圳漫无边界展能带吃的吗?:http://www.30bags.com/a/446885.html
ensogo:https://www.ikjzd.com/w/1485
雨果:https://www.ikjzd.com/w/1307
跨站点跟卖如此猖狂,你的listing有没有被盯上?:https://www.ikjzd.com/articles/121740
上新一天就破万?!日均出单200+,亚马逊大卖如何从1到N走向全球? :https://www.ikjzd.com/articles/121753
老公欲望太强 必须两天爱爱一次:http://lady.shaoqun.com/a/271050.html
深圳漫无边界门票信息:http://www.30bags.com/a/446886.html
女人发这三条信息,不是无理取闹,而是想你:http://www.30bags.com/a/446887.html

No comments:

Post a Comment