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

10次阅读

共计 3222 个字符,预计需要花费 9 分钟才能阅读完成。

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();         //100
atomicInteger.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 对象数组原子操作类。

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

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

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