- Java中有哪些原子類,原理是什么
AtomicInteger?和?AtomicLong:
用于對整數(int)和長整數(long)進行原子操作。
原理:它們內部封裝了一個整型或長整型變量,并通過使用Unsafe類提供的CAS(Compare-and-Swap)操作來實現原子更新。CAS是一種無鎖的同步機制,它在更新值時會檢查預期值是否與當前值相等,如果相等則更新為新值,否則不進行任何改變。這種操作是原子的,即不會被其他線程中斷,確保了多線程環境下更新的原子性和可見性。同時,這些類還使用了volatile關鍵字來確保變量的內存可見性,即當一個線程修改了該變量的值時,其他線程能夠立即看到最新值。
AtomicBoolean:
用于對布爾值進行原子操作。
原理:類似于AtomicInteger和AtomicLong,AtomicBoolean內部封裝了一個布爾值,并同樣使用CAS操作來實現原子的set、getAndSet、compareAndSet等操作。volatile關鍵字同樣用于確保布爾值的可見性。
AtomicReference:
用于對引用類型進行原子操作。
原理:它封裝了一個對象引用,并通過CAS操作來原子地更新引用指向的對象。compareAndSet方法會比較當前引用與預期引用是否一致,一致則替換為新的引用,否則不作更改。同樣,volatile關鍵字確保了對象引用的可見性。
AtomicIntegerArray?和?AtomicLongArray:
分別用于對整型數組和長整型數組進行原子操作。
原理:這兩個類提供了對數組元素的原子更新操作,如getAndAdd、compareAndSet等。它們同樣基于CAS機制,在更新數組元素時確保原子性,同時使用volatile數組元素來保證多線程環境下的可見性。
AtomicStampedReference:
帶有標記(stamp)的引用類型原子操作類。
原理:除了維護一個引用外,還附加了一個整數標記。在進行原子更新時,不僅比較引用本身,還會比較標記值。這種設計可以解決ABA問題(即一個值被多次改變后又變回原始值,但期間發生了其他變化,僅通過比較值本身無法察覺)。compareAndSet方法會同時檢查引用和標記是否符合預期,只有兩者都滿足條件才會更新。
AtomicIntegerFieldUpdater?和?AtomicLongFieldUpdater,以及?AtomicReferenceFieldUpdater:
這些類允許對指定類的某個非靜態整型、長整型或引用類型字段進行原子更新。
原理:它們使用反射機制獲取并操作指定對象的字段,同樣基于CAS來實現原子更新。由于需要反射,使用時需提供目標類、字段名和訪問權限修飾符。這些類適用于無法直接修改源代碼以使用原子類的情況,但使用較為繁瑣,且可能存在性能損失。
注:CAS是一種基于硬件級別的無鎖同步算法,它通過原子性地比較和交換內存中的值來實現線程安全的更新操作。在Java中,CAS主要通過Unsafe類提供的方法實現,并被廣泛應用在java.util.concurrent.atomic包下的原子類中。雖然CAS帶來了高性能和無阻塞的優點,但也存在ABA問題、潛在的自旋開銷以及對復雜同步場景支持不足等挑戰。
??如果大家需要視頻版本的講解,歡迎關注我的B站: