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
多執行緒並發場景下操作一個計數器,需要保證計數器操作的原子性。
進行數值比較,如果給定值與目前值相等,則進行數值的更新操作,並實現操作的非阻塞演算法。
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
