Atomic 翻譯成中文是原子的意思。在化學上,咱們知道原子是構成通常物質的最小單位,在化學反應中是不可分割的。在咱們這裏 Atomic 是指一個操做是不可中斷的。即便是在多個線程一塊兒執行的時候,一個操做一旦開始,就不會被其餘線程干擾。java
因此,所謂原子類說簡單點就是具備原子/原子操做特徵的類。git
併發包 java.util.concurrent
的原子類都存放在java.util.concurrent.atomic
下,以下圖所示。數組
根據操做的數據類型,能夠將JUC包中的原子類分爲4類安全
基本類型多線程
使用原子的方式更新基本類型併發
數組類型app
使用原子的方式更新數組裏的某個元素jvm
引用類型ide
對象的屬性修改類型ui
CAS ABA 問題
AtomicInteger
爲例)import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerDefectDemo { public static void main(String[] args) { defectOfABA(); } static void defectOfABA() { final AtomicInteger atomicInteger = new AtomicInteger(1); Thread coreThread = new Thread( () -> { final int currentValue = atomicInteger.get(); System.out.println(Thread.currentThread().getName() + " ------ currentValue=" + currentValue); // 這段目的:模擬處理其餘業務花費的時間 try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } boolean casResult = atomicInteger.compareAndSet(1, 2); System.out.println(Thread.currentThread().getName() + " ------ currentValue=" + currentValue + ", finalValue=" + atomicInteger.get() + ", compareAndSet Result=" + casResult); } ); coreThread.start(); // 這段目的:爲了讓 coreThread 線程先跑起來 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Thread amateurThread = new Thread( () -> { int currentValue = atomicInteger.get(); boolean casResult = atomicInteger.compareAndSet(1, 2); System.out.println(Thread.currentThread().getName() + " ------ currentValue=" + currentValue + ", finalValue=" + atomicInteger