Atomic
原子操作类是Java中提供的一组线程安全的
基本数据类型操作类
,可用于实现
线程安全
的
并发编程
。它们可以确保在
并发环境
下对变量进行
原子操作
,即不会被其他线程
中断
或
同时修改
。
Atomic
基本数据类型原子操作类, 用于对Java中的
基本类型
(如int、long、boolean、double等)进行原子操作,包括
AtomicInteger
、
AtomicLong
、
AtomicBoolean
、
AtomicDouble
等。
用AtomicInteger
来举例分析:
AtomicInteger
用来实现对整数类型
int的原子操作
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
/**
* Unsafe类是一个提供了一组低级别的操作方法的工具类。
* 它允许我们绕过Java语言的安全限制,直接操作底层的内存和对象
* 1.直接读写内存:Unsafe类中的方法可以直接读写内存,包括读写基本数据类型、读写对象引用和执行内存复制等。
* 2.分配和释放内存:Unsafe类提供了分配和释放内存的方法,可以手动控制内存的分配和释放,而不依赖于JVM的垃圾回收机制。
* 3.对象操作:Unsafe类的方法可以直接操作对象,例如获取和设置对象的字段值、获取对象的地址、创建对象实例等。
* 4.线程同步和CAS操作:Unsafe类提供了一些原子操作方法,可以用于实现线程同步和CAS(Compare and Swap)操作,用于实现高效的并发编程。
*/
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) {
throw new Error(ex); }
}
/**
* 核心变量
* 内部使用的volatile修饰符保证线程可见性
* volatile是一种轻量级的同步机制,适用于简单变量的读写,可以提供变量的可见性和有序性
*/
private volatile int value;
//构造方法,初始化value值
public AtomicInteger(int initialValue) {
value = initialValue;
}
//构造方法,使用默认初始值0
public AtomicInteger() {
}
//......省略.......
}
核心原子操作方法
- getAndSet(int newValue):设置新的整数值,并返回原来的值。
- compareAndSet(int expect, int update):如果当前值等于expect,则将当前值设置为update,返回更新是否成功。
- incrementAndGet():将当前值加1,并返回新的值。
- addAndGet(int delta):将指定的值delta与当前值相加,并返回新的值
- getAndIncrement():将当前值加1,并返回旧的值。
方法使用举例
public class AtomicIntegerModel {
public static void main