我看 JAVA 之 并发编程【三】java.util.concurrent.atomic
我看 JAVA 之 并发编程【三】java.util.concurrent.atomic
概念
java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类。主要包括如下相关原子工具类。

大致可以将原子包分为如下几类:
原子基本类
原子基本类主要包含AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference这四种类型,分别用来处理布尔,整数,长整数,对象四种数据。
以上四种类型具有如下特征:

原子数组类
原子数组类主要包含AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray,其没有像原子基本类一样,将 value 设置为 volatile,而是通过VarHandle#getVolatile、VarHandle#setVolatile、VarHandle#setRelease、VarHandle#compareAndSet 等native方法来实现 get、set、lazySet和compareAndSet等
原子属性更新器
原子属性更新器 AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater 基于反射的修改器,只有符合如下条件的属性才能被更新。
package chapter07;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
class Parent{
public volatile int age = 18;
}
class Child extends Parent {
protected volatile int hight = 180;
protected volatile static int weight = 75;
}
public class AtomicTest {
public static void main(String [] args) {
Child child = new Child();
AtomicIntegerFieldUpdater heightUpdater = AtomicIntegerFieldUpdater.newUpdater(Child.class, "hight");
heightUpdater.set(child, 182);
//java.lang.IllegalArgumentException
AtomicIntegerFieldUpdater weightUpdater = AtomicIntegerFieldUpdater.newUpdater(Child.class, "weight");
weightUpdater.set(child, 80);
//java.lang.NoSuchFieldException: age
AtomicIntegerFieldUpdater ageUpdater = AtomicIntegerFieldUpdater.newUpdater(Child.class, "age");
ageUpdater.set(child, 20);
}
}
其他
大家在使用 CAS 的时候可以解决数据被原子修改的问题,但是不能知道是否发生了 “ABA”问题,name就出现了AtomicMarkableReference,AtomicStampedReference 两个复合工具类来解决。