导航
-
- 简介
- AtomicReference
- AtomicStampedReference
- AtomicMarkableReference
简介
Atomic
原子操作类是Java中提供的一组线程安全的基本数据类型操作类
,可用于实现线程安全
的并发编程
。它们可以确保在并发环境
下对变量进行原子操作
,即不会被其他线程中断
或同时修改
。
原子更新基本类型的 AtomicInteger,只能更新一个变量, 如果要原子更新多个变量,就需要使
用这个原子更新引用类型提供的类,包括AtomicReference
、AtomicStampedReference
、AtomicMarkableReference
。
注: 源码版本是基于JDK1.8 版本
AtomicReference
是一种原子性引用类型。它提供了一种线程安全的机制,用于在多个线程之间读取和修改共享变量。AtomicReference通过使用CAS
(比较并交换)操作来实现原子性,因此可以保证操作的原子性。
源码分析
public class AtomicReference<V> implements java.io.Serializable {
private static final long serialVersionUID = -1848883965231344442L;
//Unsafe类是一个提供了一组低级别的操作方法的工具类。
//它允许绕过Java语言的安全限制,直接操作底层的内存和对象
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicReference.class.getDeclaredField("value"));
} catch (Exception ex) {
throw new Error(ex); }
}
/**
* 核心变量
* 内部使用的volatile修饰符保证线程可见性
* volatile是一种轻量级的同步机制,适用于简单变量的读写,可以提供变量的可见性和有序性
*/
private volatile V value;
public AtomicReference(V initialValue) {
value = initialValue;
}
public AtomicReference() {
}
//.....省略....
}
从源码上看, AtomicReference类似一个泛型类, 可以根据实际需要, 决定操作类型, 如对象、数组、集合等。
AtomicReference<Integer> atomicReferenceByInteger = new AtomicReference<>();
AtomicReference<Long> atomicReferenceByLong = new AtomicReference<>();
AtomicReference<Student> atomicReferenceByStudent = new AtomicReference<>();
AtomicReference 提供了一系列的原子更新方法,能够保证对引用类型的操作是原子性
- V get() : 获取值
- set(V newValue) : 设置新值
- lazySet(V newValue) : 延迟设置新值
- boolean compareAndSet(V expect, V update): 如果当前值等于expect,则将当前值设置为update,返回更新是否成功
- V getAndSet(V newValue) : 设置新的整数值,并返回原来的值
AtomicReference 主要用于提供对引用类型的原子操作,实际用途可归为以下几类:
- 线程安全的对象引用更新:AtomicReference 提供了原子级别的引用更新操作,保证了多线程环境下的线程安全性。可以用它来实现线程安全的对象引用的更新操作,避免了使用传统的锁的开销。
- 原子比较与交换操作:AtomicReference 提供了 compareAndSet 方法,可以原子地进行对象引用的比较与交换操作。这个方法可以用于实现一些需要原子性操作的场景&#x