简介
Atomic
原子操作类是Java中提供的一组线程安全的基本数据类型操作类
,可用于实现线程安全
的并发编程
。它们可以确保在并发环境
下对变量进行原子操作
,即不会被其他线程中断
或同时修改
。
Atomic数组原子类用于对Java中的数组类型
(如int[]、long[]、Object[])进行原子操作,包括AtomicIntegerArray
、AtomicLongArray
、AtomicReferenceArray
等。
AtomicReferenceArray
AtomicReferenceArray是Java中的原子类
之一,它提供了一种线程安全的方式来操作数组元素。可以用于在多线程环境中对数组
进行原子操作,避免了多线程间的竞争条件。
AtomicReferenceArray是一个类似于数组的容器,它可以存储引用类型
的元素,并且每个元素都具有原子性。它的底层实现是通过将数组元素包装为AtomicReference对象,从而实现原子操作。
下面是JDK1.8 中的AtomicReferenceArray类的部分源码
public class AtomicReferenceArray<E> implements java.io.Serializable {
private static final long serialVersionUID = -6209656149925076980L;
//Unsafe类是一个提供了一组低级别的操作方法的工具类。
//它允许绕过Java语言的安全限制,直接操作底层的内存和对象
private static final Unsafe unsafe;
private static final int base; //表示数组的基础偏移量的变量
//shift 是一个表示元素偏移量的变量
//在原子数组中,元素的偏移量是通过将元素的索引左移 shift 位来计算的。这个偏移量可以用来定位数组中的特定元素
private static final int shift;
private static final long arrayFieldOffset;
private final Object[] array; //内部使用的Object[]数组,存储实际的原子元素
static {
try {
unsafe = Unsafe.getUnsafe();
arrayFieldOffset = unsafe.objectFieldOffset
(AtomicReferenceArray.class.getDeclaredField("array"));
base = unsafe.arrayBaseOffset(Object[].class);
/**
* Unsafe.arrayIndexScale()是获取数组引用中的一个元素的偏移量(offset)
* 返回一个int值,表示数组中连续元素的偏移量。 在内存中,数组的不同元素之间的间隔
* 可能会有所不同,这取决于元素的类型和实现架构。arrayIndexScale()方法的目的
* 是根据数组元素的类型来获取该数组中连续元素之间的偏移量。
*/
int scale = unsafe.arrayIndexScale(Object[]