我看 JAVA 之 并发编程【三】java.util.concurrent.atomic
我看 JAVA 之 并发编程【三】java.util.concurrent.atomic
概念
java.util.concurrent.atomic 原子操作类包里面提供了一组原子变量类。主要包括如下相关原子工具类。
大致可以将原子包分为如下几类:
原子基本类
原子数组类
原子属性更新器
其他
原子基本类
原子基本类主要包含 AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference 这四种类型,分别用来处理布尔,整数,长整数,对象四种数据。
以上四种类型具有如下特征:
均有一个 private volatile 的 value 属性。
AtomicInteger,AtomicLong 扩展了基本类型的类,但是并没有扩展基本类型的包装类。
均实现了 get、set、lazySet、compareAndSet 方法
get() 直接获取主存内的数据,内部实现为 VarHandle#getVolatile,为 native 方法
set(newValue) 直接刷新主存数据,内部实现为 VarHandle#setVolatile,为 native 方法
lazySet(newValue) 内部实现为 VarHandle#setRelease,为 native 方法
compareAndSet(int expectedValue, int newValue) 内部实现为 U.compareAndSetXXX(this, VALUE, expectedValue, newValue)
原子数组类
原子数组类主要包含 AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray,其没有像原子基本类一样,将 value 设置为 volatile,而是通过 VarHandle#getVolatile、VarHandle#setVolatile、VarHandle#setRelease、VarHandle#compareAndSet 等 native 方法来实现 get、set、lazySet 和 compareAndSet 等
原子属性更新器
原子属性更新器 AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater 基于反射的修改器,只有符合如下条件的属性才能被更新。
指定的属性名必须存在
必须为 volatile 的属性
必须遵循 java 访问权限控制规则,仅能修改 Declared 的属性,不能修改自继承的父类属性
属性必须可修改,不能修改 final 修饰的属性
不能修改 static 修饰的属性
其他
大家在使用 CAS 的时候可以解决数据被原子修改的问题,但是不能知道是否发生了 “ABA”问题,name 就出现了 AtomicMarkableReference,AtomicStampedReference 两个复合工具类来解决。
AtomicMarkableReference 类将单个 boolean 变量与引用关联起来,来表示引用变量是否被更改过。
AtomicStampedReference 类将单个 int 值构成的 stamp(标记)与引用关联起来,来表示引用变量是否被更改的次数,来解决 ABA 问题。
评论