java并發(fā)JUC工具包AtomicInteger原子整型語法基礎(chǔ)
AtomicInteger 類底層存儲一個int值,并提供方法對該int值進行原子操作。AtomicInteger 作為java.util.concurrent.atomic包的一部分,從Java 1.5開始引入。
1. AtomicInteger基礎(chǔ)用法
通過下文的AtomicInteger構(gòu)造方法,可以創(chuàng)建一個AtomicInteger對象,該對象的初始值默認為0。AtomicInteger提供get和set方法,獲取底層int整數(shù)值,與設(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而言并不是它的核心內(nèi)容,AtomicInteger核心內(nèi)容體現(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操作將一個內(nèi)存位置的內(nèi)容與一個給定的值進行比較,只有當它們相同時,才會將該內(nèi)存位置的內(nèi)容修改為一個給定的新值。這個過程是以單個原子操作的方式完成的。
compareAndSet方法:如果當前值==預(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);
//當前值100 = 預(yù)期值100,所以設(shè)置atomicInteger=110
boolean isSuccess = atomicInteger.compareAndSet(100,110);
System.out.println(isSuccess); //輸出結(jié)果為true表示操作成功
//當前值110 = 預(yù)期值100?不相等,所以atomicInteger仍然等于110
isSuccess = atomicInteger.compareAndSet(100,120);
System.out.println(isSuccess); //輸出結(jié)果為false表示操作失敗
}
}
3. 總結(jié)
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原子整型語法基礎(chǔ)的詳細內(nèi)容,更多關(guān)于JUC AtomicInteger原子整型語法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中的HashSet、LinkedHashSet集合解析
這篇文章主要介紹了Java中的HashSet、LinkedHashSet集合解析,與HashSet不同的是,LinkedHashSet在內(nèi)部使用了一個雙向鏈表來維護元素的順序,因此它可以保持元素的插入順序,這使得LinkedHashSet在需要保持元素順序的場景下非常有用,需要的朋友可以參考下2023-11-11
Spring IOC:CreateBean環(huán)節(jié)中的流程轉(zhuǎn)換
Spring IOC 體系是一個很值得深入和研究的結(jié)構(gòu) , 只有自己真正的讀一遍 , 才能有更好的理解.這篇文章主要說明一下 CreateBean 整個環(huán)節(jié)中的大流程轉(zhuǎn)換 , 便于查找問題的原因2021-05-05
zookeeper實戰(zhàn)之實現(xiàn)分布式鎖的方法
Zookeeper實現(xiàn)分布式鎖比Redis簡單,Zookeeper有一個特性,多個線程在Zookeeper里創(chuàng)建同一個節(jié)點時,只有一個線程執(zhí)行成功,Zookeeper主要是利用臨時有序節(jié)點這一特性實現(xiàn)分布式鎖,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2022-11-11
SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)
本文主要介紹了SpringBoot中MyBatis使用自定義TypeHandler,當默認的類型映射不能滿足需求時,自定義?TypeHandler?就非常有用,具有一定的參考價值,感興趣的可以了解一下2024-08-08
使用CI/CD工具Github Action發(fā)布jar到Maven中央倉庫的詳細介紹
今天通過對Github Action的簡單使用來介紹了CI/CD的作用,這個技術(shù)體系是項目集成交付的趨勢,也是面試中的一個亮點技能。 而且這種方式可以實現(xiàn)“一次配置,隨時隨地集成部署”,感興趣的朋友一起看看吧2021-07-07

