AtomicInteger使用方式及源碼介紹

這是我參與更文挑戰的第 9 天,活動詳情查看:更文挑戰java

做者:JavaGieGie面試

微信公衆號:Java開發零到壹安全

前言

AtomicInteger是java.util.concurrent.atomic 包下的一個原子類,該包下還有AtomicBoolean, AtomicLong,AtomicLongArray, AtomicReference等原子類,主要用於在高併發環境下,保證線程安全。微信

正文

1. 使用場景

咱們都知道,a++ 這個操做在多線程併發執行的狀況下,是非線程安全的。而且因爲a++過程包含三個步驟,即非原子性,因此即便使用volatile也不能保證線程安全;而加鎖(如Synchronized)又十分影響性能,所以這個時候很是適用使用AtomicInteger來實現變量的自增。markdown

2. 案例代碼

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerDemo implements Runnable {
    private static final AtomicInteger atomicInteger = new AtomicInteger();

    //增長指定數量
    public void getAndAdd() {
        atomicInteger.getAndAdd(-90);
    }
    //增長1
    public void getAndIncrement() {
        atomicInteger.getAndIncrement();
    }
    //減小1
    public void getAndDecrement() {
        atomicInteger.getAndDecrement();
    }
    public static void main(String[] args) throws InterruptedException {
        AtomicIntegerDemo r = new AtomicIntegerDemo();
        Thread t1 = new Thread(r);
        t1.start();
        t1.join();
        System.out.println("AtomicInteger操做結果:" + atomicInteger.get());
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            getAndDecrement();
        }
    }
}
複製代碼

3. 方法介紹

  1. getAndIncrement

對變量atomicInteger進行 +1 操做。多線程

  1. getAndAdd

能夠對變量atomicInteger進行增長 N(指定增長數量)操做。併發

  1. getAndDecrement

對變量atomicInteger進行 -1 操做。ide

  1. get

獲取AtomicInteger當前值。高併發

4. 源碼簡介

這裏介紹一下AtomicInteger.incrementAndGet()方法,該方法內有一個死循環,它首先會獲取當前值,而後調用compareAndSet方法,判斷當前值是否已經被其餘線程修改,若是compareAndSet返回false會繼續重試,直到成功爲止,這也就是AtomicInteger可以實現原子性的精髓。post

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}
複製代碼

上面提到compareAndSet,這裏看下源碼:

public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
複製代碼

從源碼中能夠看到:compareAndSet()調用了Unsafe.compareAndSwapInt()方法,也就是Unsafe類的CAS操做。

CAS會在《蹲坑也能進大廠》系列進行講解,有興趣的小夥伴能夠關注。

總結

AtomicInteger應用場景也比較單純,除去高度競爭的狀況,原子類相比於普通的鎖,粒度更細而且效率也更高,本文對經常使用方法進行介紹,有須要對源碼深刻了解的,能夠繼續探索,有任何疑問能夠在文章下方評論哦。

點關注,防走丟

以上就是本期所有內容,若有紕漏之處,請留言指教,很是感謝。我是花GieGie ,有問題你們隨時留言討論 ,咱們下期見🦮。

文章持續更新,能夠微信搜一搜 Java開發零到壹 第一時間閱讀,而且能夠獲取面試資料學習視頻等,有興趣的小夥伴歡迎關注,一塊兒學習,一塊兒哈🐮🥃。

原創不易,你怎忍心白嫖,若是你以爲這篇文章對你有點用的話,感謝老鐵爲本文點個贊、評論或轉發一下,由於這將是我輸出更多優質文章的動力,感謝!

相關文章
相關標籤/搜索