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
- 多线程并发场景下操作一个计数器,须要保障计数器操作的原子性。
- 进行数值比拟,如果给定值与以后值相等,进行数值的更新操作,并实现操作的非阻塞算法。
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对象数组原子操作类。
欢送关注我的博客,外面有很多精品合集
本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 - zimug.com
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端拆散RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》