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