写点什么

我看 JAVA 之 并发编程【三】java.util.concurrent.atomic

用户头像
awen
关注
发布于: 9 小时前
我看 JAVA 之 并发编程【三】java.util.concurrent.atomic

我看 JAVA 之 并发编程【三】java.util.concurrent.atomic

概念

  java.util.concurrent.atomic 原子操作类包里面提供了一组原子变量类。主要包括如下相关原子工具类。

大致可以将原子包分为如下几类:

  1. 原子基本类

  2. 原子数组类

  3. 原子属性更新器

  4. 其他


原子基本类

原子基本类主要包含 AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference 这四种类型,分别用来处理布尔,整数,长整数,对象四种数据。

以上四种类型具有如下特征:

  1. 均有一个 private volatile 的 value 属性。

  2. AtomicInteger,AtomicLong 扩展了基本类型的类,但是并没有扩展基本类型的包装类。

  3. 均实现了 get、set、lazySet、compareAndSet 方法

  4. get() 直接获取主存内的数据,内部实现为 VarHandle#getVolatile,为 native 方法

  5. set(newValue) 直接刷新主存数据,内部实现为 VarHandle#setVolatile,为 native 方法

  6. lazySet(newValue) 内部实现为 VarHandle#setRelease,为 native 方法

  7. 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 基于反射的修改器,只有符合如下条件的属性才能被更新。

  1. 指定的属性名必须存在

  2. 必须为 volatile 的属性

  3. 必须遵循 java 访问权限控制规则,仅能修改 Declared 的属性,不能修改自继承的父类属性

  4. 属性必须可修改,不能修改 final 修饰的属性

  5. 不能修改 static 修饰的属性

其他

大家在使用 CAS 的时候可以解决数据被原子修改的问题,但是不能知道是否发生了 “ABA”问题,name 就出现了 AtomicMarkableReference,AtomicStampedReference 两个复合工具类来解决。

  1. AtomicMarkableReference 类将单个 boolean 变量与引用关联起来,来表示引用变量是否被更改过

  2. AtomicStampedReference 类将单个 int 值构成的 stamp(标记)与引用关联起来,来表示引用变量是否被更改的次数,来解决 ABA 问题


用户头像

awen

关注

Things happen for a reason. 2019.11.15 加入

还未添加个人简介

评论

发布
暂无评论
我看 JAVA 之 并发编程【三】java.util.concurrent.atomic