1 Atomic 原子类介绍

1原子类介绍
翻译成中文是原子的意思 。在化学上 , 我们知道原子是构成一般物质的最小单位 , 在化学反应中是不可分割的 。在我们这里是指一个操作是不可中断的 。即使是在多个线程一起执行的时候 , 一个操作一旦开始 , 就不会被其他线程干扰 。
所以 , 所谓原子类说简单点就是具有原子/原子操作特征的类 。
并发包 java.util. 的原子类都存放在java.util..下,如下图所示 。

1 Atomic 原子类介绍

文章插图
根据操作的数据类型 , 可以将JUC包中的原子类分为4类
基本类型
使用原子的方式更新基本类型
数组类型
使用原子的方式更新数组里的某个元素
引用类型
对象的属性修改类型
修正: nce 不能解决ABA问题 issue#626
/**AtomicMarkableReference是将一个boolean值作是否有更改的标记 , 本质就是它的版本号只有两个 , true和false , 修改的时候在这两个版本号之间来回切换 , 这样做并不能解决ABA的问题 , 只是会降低ABA问题发生的几率而已@author : Jack Li@Date : 2020/1/17 14:41*/public class SolveABAByAtomicMarkableReference {private static AtomicMarkableReference atomicMarkableReference = new AtomicMarkableReference(100, false);public static void main(String[] args) {Thread refT1 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}atomicMarkableReference.compareAndSet(100, 101, atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());atomicMarkableReference.compareAndSet(101, 100, atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());});Thread refT2 = new Thread(() -> {boolean marked = atomicMarkableReference.isMarked();try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}boolean c3 = atomicMarkableReference.compareAndSet(100, 101, marked, !marked);System.out.println(c3); // 返回true,实际应该返回false});refT1.start();refT2.start();}}
CAS ABA 问题
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 = http://www.kingceram.com/post/atomicInteger.get();System.out.println(Thread.currentThread().getName() +" ------ currentValue="http://www.kingceram.com/post/+ currentValue);// 这段目的:模拟处理其他业务花费的时间try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}boolean casResult = atomicInteger.compareAndSet(1, 2);System.out.println(Thread.currentThread().getName()+" ------ currentValue="http://www.kingceram.com/post/+ currentValue+", finalValue="http://www.kingceram.com/post/+ atomicInteger.get()+", compareAndSet Result=" + casResult);});coreThread.start();// 这段目的:为了让 coreThread 线程先跑起来try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}Thread amateurThread = new Thread(() -> {int currentValue = http://www.kingceram.com/post/atomicInteger.get();boolean casResult = atomicInteger.compareAndSet(1, 2);System.out.println(Thread.currentThread().getName()+" ------ currentValue="http://www.kingceram.com/post/+ currentValue+", finalValue="http://www.kingceram.com/post/+ atomicInteger.get()+", compareAndSet Result=" + casResult);currentValue = http://www.kingceram.com/post/atomicInteger.get();casResult = atomicInteger.compareAndSet(2, 1);System.out.println(Thread.currentThread().getName()+" ------ currentValue="http://www.kingceram.com/post/+ currentValue+", finalValue="http://www.kingceram.com/post/+ atomicInteger.get()+", compareAndSet Result=" + casResult);});amateurThread.start();}}