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

Hello friends social networking, on this occasion the admin wants to share an article entitled java并发编程JUC第十二篇:AtomicInteger原子整型 , we have made good, quality and useful articles for you to read and take information in. hopefully the post content is about which we write you can understand. Alright, happy reading.

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


That's the article: java并发编程JUC第十二篇:AtomicInteger原子整型
Thank you for visiting my blog, hopefully it can be useful for all of you. Don't forget to share this article with your friends so they also know the interesting info, see you in other article posts.

You are now reading the article java并发编程JUC第十二篇:AtomicInteger原子整型 with link address https://socialnetworkingupdate.blogspot.com/2021/06/javajucatomicinteger.html

More Articles

Post a Comment

Mas Bago Mas luma

Iklan In-Feed (homepage)

#Advertisement