首頁  >  文章  >  Java  >  Java並發程式設計:JUC工具包的AtomicInteger原子整型使用範例分析

Java並發程式設計:JUC工具包的AtomicInteger原子整型使用範例分析

WBOY
WBOY轉載
2023-04-25 22:22:30873瀏覽

    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

    多執行緒並發場景下操作一個計數器,需要保證計數器操作的原子性。

    進行數值比較,如果給定值與目前值相等,則進行數值的更新操作,並實現操作的非阻塞演算法。

    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物件陣列原子操作類別。

    以上是Java並發程式設計:JUC工具包的AtomicInteger原子整型使用範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除