天天看點

java并發程式設計JUC第十二篇:AtomicInteger原子整型

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();         //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對象數組原子操作類。

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載注明出處(必須帶連接配接,不能隻轉文字):字母哥部落格。

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品内容,期待您的關注。

  • 《手摸手教你學Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《實戰前後端分離RBAC權限管理系統》
  • 《實戰SpringCloud微服務從青銅到王者》
  • 《VUE深入淺出系列》