這是我參與更文挑戰的第 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. 方法介紹
對變量atomicInteger進行 +1 操做。多線程
能夠對變量atomicInteger進行增長 N(指定增長數量)操做。併發
對變量atomicInteger進行 -1 操做。ide
獲取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開發零到壹 第一時間閱讀,而且能夠獲取面試資料學習視頻等,有興趣的小夥伴歡迎關注,一塊兒學習,一塊兒哈🐮🥃。
原創不易,你怎忍心白嫖,若是你以爲這篇文章對你有點用的話,感謝老鐵爲本文點個贊、評論或轉發一下
,由於這將是我輸出更多優質文章的動力,感謝!