簡體   English   中英

如果包裝類已經是不可變的,為什么我們需要Atomic *類?

[英]Why do we need Atomic* classes if wrapper classes are already immutable?

我最近遇到了java.util.concurrent.atomic包中的原子類。 據我所知,不可變類本質上是默認的線程安全,所以我們不需要同步它們。 后來我才知道Integer,Boolean,Character等包裝類本質上是不可變的,為什么我們需要像AtomicInteger或AtomicLong這樣的Atomic *類。 另外,請解釋什么是AtomicReference

原子類是可變的 ,但在修改方面具有強大的內存一致性保證。 因此它們與不可變包裝類有不同的用途。

Atomic*類的真正優勢在於它們公開了一種原子比較和交換方法,這對於實現無鎖算法非常有用。

像許多中級到高級並發工具一樣,如果你無法想象為什么你需要這樣的東西,那么你可能不應該嘗試使用它們。 如果你堅持不變性或在任何地方顯式鎖定,那么你可能不需要原子。

是一個關於compareAndSet原理的一個很好的問題。

來自文檔:

  • 這些方法的規范使實現能夠采用當代處理器上可用的高效機器級原子指令。

閱讀atomic / volatile / synchronized將幫助您保持它們之間的差異。

你有沒有想過當我有一個Integer(1) ,我怎么能把它改成Integer(2) ,整數是不可變的。所以我需要創建一個新的並設置它的值,但這個過程不是原子的。

當某些東西是可變的時,原子性的概念就來了。 我們希望修改字段/變量(可以是多步,讀取 - >更新 - >寫入)作為原子操作的操作。 因此,在多線程場景中,不應存在任何數據損壞。 java.util.concurrent.atomic包為我們做了。 包裝類是不可變的,我們無法修改它,需要創建一個新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM