最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

1. AtomicInteger基礎(chǔ)用法

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

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

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

2. 什么時(shí)候需要使用AtomicInteger

我們通常在以下的兩種場(chǎng)景下使用AtomicInteger

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

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

2.1. 原子計(jì)數(shù)器場(chǎng)景

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

比如從一個(gè)map里面獲取值,用get()方法,這是第一個(gè)操作;獲取到值之后給這個(gè)值加上n,這是第二個(gè)操作;將進(jìn)行過加法運(yùn)算的值,再次放入map里面是第三個(gè)操作。所謂操作的原子性是指:在多線程并發(fā)的場(chǎng)景下,上面的三個(gè)操作是原子性的,也就是不可分割的。不會(huì)出現(xiàn)A線程get了數(shù)值,B線程同時(shí)也get到了該數(shù)值,兩個(gè)線程同時(shí)為該值做運(yùn)算并先后再次放入的情況,這種情況對(duì)于AtomicInteger而言是不會(huì)出現(xiàn)的,AtomicInteger操作是線程安全的、不可分割的。

addAndGet()- 將給定的值加到當(dāng)前值上,并在加法后返回新值,并保證操作的原子性。

getAndAdd()- 將給定的值加到當(dāng)前值上,并返回舊值,并保證操作的原子性。

incrementAndGet()- 將當(dāng)前值增加1,并在增加后返回新值。它相當(dāng)于++i操作,并保證操作的原子性。

getAndIncrement()- 將當(dāng)前值增加1并返回舊值。相當(dāng)于++i操作,并保證操作的原子性。

decrementAndGet()- 將當(dāng)前值減去1,并在減去后返回新值,相當(dāng)于i--操作,并保證操作的原子性。

getAndDecrement()- 將當(dāng)前值減去1,并返回舊值。它相當(dāng)于 --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ù)值比對(duì)及交換操作

compareAndSet操作將一個(gè)內(nèi)存位置的內(nèi)容與一個(gè)給定的值進(jìn)行比較,只有當(dāng)它們相同時(shí),才會(huì)將該內(nèi)存位置的內(nèi)容修改為一個(gè)給定的新值。這個(gè)過程是以單個(gè)原子操作的方式完成的。

compareAndSet方法:如果當(dāng)前值==預(yù)期值,則將值設(shè)置為給定的更新值。

boolean compareAndSet(int expect, int update)

expect是預(yù)期值

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);
        //當(dāng)前值100 = 預(yù)期值100,所以設(shè)置atomicInteger=110
        boolean isSuccess = atomicInteger.compareAndSet(100,110);  
        System.out.println(isSuccess);      //輸出結(jié)果為true表示操作成功
        //當(dāng)前值110 = 預(yù)期值100?不相等,所以atomicInteger仍然等于110
        isSuccess = atomicInteger.compareAndSet(100,120);  
        System.out.println(isSuccess);      //輸出結(jié)果為false表示操作失敗
    }
}

3. 總結(jié)

AtomicInteger可以幫助我們?cè)诓皇褂胹ynchronized同步鎖的情況下,實(shí)現(xiàn)在多線程場(chǎng)景下int數(shù)值操作的線程安全,操作的原子性。并且使用AtomicInteger來實(shí)現(xiàn)int數(shù)值的原子操作,遠(yuǎn)比使用synchronized同步鎖效率更高。

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

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

相關(guān)文章

  • spring常用注解開發(fā)一個(gè)RESTful接口示例

    spring常用注解開發(fā)一個(gè)RESTful接口示例

    這篇文章主要為大家介紹了使用spring常用注解開發(fā)一個(gè)RESTful接口示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java中的HashSet、LinkedHashSet集合解析

    Java中的HashSet、LinkedHashSet集合解析

    這篇文章主要介紹了Java中的HashSet、LinkedHashSet集合解析,與HashSet不同的是,LinkedHashSet在內(nèi)部使用了一個(gè)雙向鏈表來維護(hù)元素的順序,因此它可以保持元素的插入順序,這使得LinkedHashSet在需要保持元素順序的場(chǎng)景下非常有用,需要的朋友可以參考下
    2023-11-11
  • 解決SpringBoot中使用@Async注解失效的問題

    解決SpringBoot中使用@Async注解失效的問題

    這篇文章主要介紹了解決SpringBoot中使用@Async注解失效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java實(shí)現(xiàn)貪吃蛇極速版

    java實(shí)現(xiàn)貪吃蛇極速版

    這篇文章主要為大家分享了java貪吃蛇極速版,貪吃蛇經(jīng)典手機(jī)游戲,既簡(jiǎn)單又耐玩,本文用java來實(shí)現(xiàn)下貪吃蛇小游戲,感興趣的小伙伴可以參考下
    2015-12-12
  • Hibernate hql查詢代碼實(shí)例

    Hibernate hql查詢代碼實(shí)例

    這篇文章主要介紹了Hibernate hql查詢代碼實(shí)例,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Spring IOC:CreateBean環(huán)節(jié)中的流程轉(zhuǎn)換

    Spring IOC:CreateBean環(huán)節(jié)中的流程轉(zhuǎn)換

    Spring IOC 體系是一個(gè)很值得深入和研究的結(jié)構(gòu) , 只有自己真正的讀一遍 , 才能有更好的理解.這篇文章主要說明一下 CreateBean 整個(gè)環(huán)節(jié)中的大流程轉(zhuǎn)換 , 便于查找問題的原因
    2021-05-05
  • zookeeper實(shí)戰(zhàn)之實(shí)現(xiàn)分布式鎖的方法

    zookeeper實(shí)戰(zhàn)之實(shí)現(xiàn)分布式鎖的方法

    Zookeeper實(shí)現(xiàn)分布式鎖比Redis簡(jiǎn)單,Zookeeper有一個(gè)特性,多個(gè)線程在Zookeeper里創(chuàng)建同一個(gè)節(jié)點(diǎn)時(shí),只有一個(gè)線程執(zhí)行成功,Zookeeper主要是利用臨時(shí)有序節(jié)點(diǎn)這一特性實(shí)現(xiàn)分布式鎖,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2022-11-11
  • SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)

    SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中MyBatis使用自定義TypeHandler,當(dāng)默認(rèn)的類型映射不能滿足需求時(shí),自定義?TypeHandler?就非常有用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • Spring Boot的Profile配置詳解

    Spring Boot的Profile配置詳解

    本篇文章主要介紹了Spring Boot的Profile配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 使用CI/CD工具Github Action發(fā)布jar到Maven中央倉庫的詳細(xì)介紹

    使用CI/CD工具Github Action發(fā)布jar到Maven中央倉庫的詳細(xì)介紹

    今天通過對(duì)Github Action的簡(jiǎn)單使用來介紹了CI/CD的作用,這個(gè)技術(shù)體系是項(xiàng)目集成交付的趨勢(shì),也是面試中的一個(gè)亮點(diǎn)技能。 而且這種方式可以實(shí)現(xiàn)“一次配置,隨時(shí)隨地集成部署”,感興趣的朋友一起看看吧
    2021-07-07

最新評(píng)論

揭阳市| 安泽县| 元江| 遂平县| 西城区| 漯河市| 伊通| 曲麻莱县| 长寿区| 城步| 德惠市| 获嘉县| 曲靖市| 闵行区| 长沙市| 治县。| 孟津县| 上栗县| 通海县| 垣曲县| 洞头县| 金湖县| 呼伦贝尔市| 册亨县| 思南县| 桐城市| 平山县| 土默特右旗| 阳曲县| 静宁县| 道孚县| 通许县| 中阳县| 萨迦县| 新干县| 皋兰县| 昭平县| 卓资县| 麻江县| 东阳市| 盐池县|