欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java并發(fā)JUC工具包AtomicInteger原子整型語法基礎

 更新時間:2022年03月15日 10:36:40   作者:字母哥哥  
這篇文章主要為大家介紹了java并發(fā)JUC工具包AtomicInteger原子整型語法基礎,有需要的朋友可以借鑒參考希望能夠有所幫助,祝大家多多進步

AtomicInteger 類底層存儲一個int值,并提供方法對該int值進行原子操作。AtomicInteger 作為java.util.concurrent.atomic包的一部分,從Java 1.5開始引入。

1. AtomicInteger基礎用法

通過下文的AtomicInteger構造方法,可以創(chuàng)建一個AtomicInteger對象,該對象的初始值默認為0。AtomicInteger提供get和set方法,獲取底層int整數(shù)值,與設置int整數(shù)值

//初始值為0的atomicInteger對象
AtomicInteger atomicInteger = new AtomicInteger();  
//初始值為200的atomicInteger對象
AtomicInteger atomicInteger = new AtomicInteger(200);
int currentValue = atomicInteger.get();         //100
atomicInteger.set(2453);                        //現(xiàn)在的值是 2453

但是上面的方法,對于AtomicInteger而言并不是它的核心內容,AtomicInteger核心內容體現(xiàn)在它的原子性,我們下文介紹。

2. 什么時候需要使用AtomicInteger

我們通常在以下的兩種場景下使用AtomicInteger

多線程并發(fā)場景下操作一個計數(shù)器,需要保證計數(shù)器操作的原子性。

進行數(shù)值比較,如果給定值與當前值相等,進行數(shù)值的更新操作,并實現(xiàn)操作的非阻塞算法。

2.1. 原子計數(shù)器場景

AtomicInteger作為一個計數(shù)器使用,AtomicInteger提供了若干方法進行加法、減法的原子操作。

比如從一個map里面獲取值,用get()方法,這是第一個操作;獲取到值之后給這個值加上n,這是第二個操作;將進行過加法運算的值,再次放入map里面是第三個操作。所謂操作的原子性是指:在多線程并發(fā)的場景下,上面的三個操作是原子性的,也就是不可分割的。不會出現(xiàn)A線程get了數(shù)值,B線程同時也get到了該數(shù)值,兩個線程同時為該值做運算并先后再次放入的情況,這種情況對于AtomicInteger而言是不會出現(xiàn)的,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. 數(shù)值比對及交換操作

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同步鎖的情況下,實現(xiàn)在多線程場景下int數(shù)值操作的線程安全,操作的原子性。并且使用AtomicInteger來實現(xiàn)int數(shù)值的原子操作,遠比使用synchronized同步鎖效率更高。

java.util.concurrent.atomic包不僅為我們提供了AtomicInteger,還提供了AtomicBoolean布爾原子操作類、AtomicLong長整型布爾原子操作類、AtomicReference對象原子操作類、AtomicIntegerArray整型數(shù)組原子操作類、AtomicLongArray長整型數(shù)組原子操作類、AtomicReferenceArray對象數(shù)組原子操作類。

以上就是java并發(fā)JUC工具包AtomicInteger原子整型語法基礎的詳細內容,更多關于JUC AtomicInteger原子整型語法的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解java 中的CAS與ABA

    詳解java 中的CAS與ABA

    這篇文章主要介紹了java 中的CAS與ABA的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-05-05
  • MyBatis多對多映射初識教程

    MyBatis多對多映射初識教程

    這篇文章重點給大家介紹mybatis多對多映射,多對多映射的例子也很常見,本文通過代碼實例相結合的方式給大家介紹mybatis多對多映射,需要的朋友參考下吧
    2016-08-08
  • spring boot教程之全局處理異常封裝

    spring boot教程之全局處理異常封裝

    這篇文章主要給大家介紹了關于spring boot教程之全局處理異常封裝的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Java自定義類加載器實現(xiàn)類隔離詳解

    Java自定義類加載器實現(xiàn)類隔離詳解

    由于每種組件的不同版本所依賴的jar包不同,我們可以借鑒tomcat的實現(xiàn)方式,通過自定義類加載器打破雙親委派機制來實現(xiàn)類隔離,從而達到操作多組件多版本的目的。本文就來和大家詳細聊聊實現(xiàn)方法
    2023-03-03
  • Spring中HandlerMethod類源碼詳細解析

    Spring中HandlerMethod類源碼詳細解析

    這篇文章主要介紹了Spring中HandlerMethod類源碼詳細解析,HandlerMethod類用于封裝控制器方法信息,包含類信息、方法Method對象、參數(shù)、注解等信息,具體的接口請求是可以根據封裝的信息調用具體的方法來執(zhí)行業(yè)務邏輯,需要的朋友可以參考下
    2023-11-11
  • 基于SpringBoot實現(xiàn)圖片上傳及圖片回顯

    基于SpringBoot實現(xiàn)圖片上傳及圖片回顯

    本篇文章主要介紹了SpringBoot如何實現(xiàn)圖片上傳及圖片回顯,文中通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-08-08
  • Java解壓zip文件完整代碼分享

    Java解壓zip文件完整代碼分享

    這篇文章主要介紹了Java解壓zip文件完整代碼分享,向大家分享了兩部分代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot的自定義banner使用方法

    SpringBoot的自定義banner使用方法

    這篇文章主要介紹了SpringBoot的自定義banner使用方法,在Spring Boot中,你可以通過定制Banner來個性化你的應用程序啟動時的輸出,Banner是一個在應用程序啟動時顯示的ASCII藝術字形式的標志,用于增加應用程序的識別度和個性化,需要的朋友可以參考下
    2024-01-01
  • Java StackTraceElement實例代碼

    Java StackTraceElement實例代碼

    這篇文章主要介紹了Java StackTraceElement實例代碼,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • maven項目如何依賴自定jar包

    maven項目如何依賴自定jar包

    這篇文章主要介紹了maven項目如何依賴自定jar包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02

最新評論