您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中怎么實現原子操作類,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
在 JDK1.5 中新增 java.util.concurrent(J.U.C) 包,它建立在 CAS 之上。CAS 是非阻塞算法的一種常見實現,相對于 synchronized 這種阻塞算法,它的性能更好。
DK1.5 中引入了底層的支持,在 int、long 和對象的引用等類型上都公開了 CAS 的操作,并且 JVM 把它們編譯為底層硬件提供的最有效的方法,在運行 CAS 的平臺上,運行時把它們編譯為相應的機器指令。在 java.util.concurrent.atomic 包下面的所有的原子變量類型中,比如 AtomicInteger,都使用了這些底層的JVM支持為數字類型的引用類型提供一種高效的 CAS 操作。
atomic 包中的 13 個類,屬于 4 種類型的原子更新方式.
(1)原子更新基本類型
(2)原子更新數組
(3)原子更新引用
(4)原子更新屬性
atomic 包里的類基本都是使用 Unsafe 實現的包裝類.
AtomicBoolean:原子更新布爾類型。
AtomicInteger:原子更新整型。
AtomicLong:原子更新長整型。
本類以 AtomicInteger 進行講解:
AtomicInteger 是一個支持原子操作的 Integer 類,就是保證對 AtomicInteger 類型變量的增加和減少操作是原子性的,不會出現多個線程下的數據不一致問題。如果不使用 AtomicInteger,要實現一個按順序獲取的 ID,就必須在每次獲取時進行加鎖操作,以避免出現并發時獲取到同樣的 ID 的現象。
int addAndGet(int delta) 以原子方式將輸入的數值與實例中的值相加,并返回結果;
boolean compareAndSet(int expect, int update) 如果輸入的數值等于預期值,則以原子的方式將該值設置為輸入的值;
int getAndIncrement() 以原子方式將當前值加 1,注意,這里返回的是自增前的值;
void lazySet(int newValue) 最終會設置成 newValue,使用 lazySet 設置值后,可能導致其他線程在之后的一小段時間內還是可以讀到 舊值;
int getAndSet(int newValue) 以原子方式設置為 newValue 的值,并返回舊值。
那么getAndIncrement 是如何實現原子操作的呢?
1public final int getAndIncrement() {
2 for (;;) {
3 int current = get();
4 int next = current + 1;
5 if (compareAndSet(current, next))
6 return current;
7 }
8}
關于Java中怎么實現原子操作類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。