导航
-
- 一. 简介
- 二. 源码分析
- 三. 原子操作原理
- 三. 实际用途
-
- 1. 标志位
- 2. 唯一标识生成器
- 3. 计数器

一. 简介
AtomicInteger
是Java中提供的一种线程安全
的原子操作
类,用来实现对整数类型的原子操作。它可以在多线程环境下保证对整数的原子性操作,而不需要使用synchronized
关键字或者其他锁机制
。
二. 源码分析
JDK1.8 中AtomicInteger源码:
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() {
}
//......省略.......
}
AtomicInteger类提供了多种方法来对整数进行原子操作,常用的方法有:
- get() : 获取当前的整数值
public final int get() {
return value;
}
- set(int newValue):设置新的整数值
public final void set(int newValue) {
value = newValue;
}
- getAndSet(int newValue):设置新的整数值,并返回原来的值。
public final int getAndSet(int newValue) {
return unsafe.getAndSetInt(this, valueOffset, newValue);
}
- compareAndSet(int expect, int update):如果当前值等于expect,则将当前值设置为update,返回更新是否成功。
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this