Bootstrap

我看 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 两个复合工具类来解决。