JAVA原子类 AtomicInteger
JAVA原子类
java原子类位于:JUC包(java.util.concurrent.atomic.Atomic*)中
举例:
class AtomicInteger extends Number implements java.io.Serializable
import java.util.concurrent.atomic.AtomicInteger;
public class CASDemo {
public static void main(String[] args) {
// 原始值为 5
AtomicInteger atomicInteger = new AtomicInteger(5);
// 因为原始值和期望值相等,则更新值为 2019
System.out.println(atomicInteger.compareAndSet(5,2019) + " current : " + atomicInteger.get());
// 由于上述已经将值改为 2019,所以与期望值比较不相等,不能更新值
System.out.println(atomicInteger.compareAndSet(5,1024) + " current : " + atomicInteger.get());
// 获取最后修改成功的值
System.out.println(atomicInteger.getAndIncrement());
}
}
输出:
true current 2019
false current 2019
2019
原子类原理
Unsafe是 CAS 的核心类,CAS 的全称为 Compare-And-Swap,它是一条 CPU 并发原语。由于 Java 方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe 相当于一个后门,基于该类可以直接操作特定内存的数据。Unsafe 类存在于 sun.misc 包中,其内部方法操作可以像 C 的指针一样直接操作内存。CAS 并发原语体现在 Java 语言中就是 sun.misc.Unsafe 类中的各个方法,调用 Unsafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS 汇编指令。这是一种完全依赖于 硬件 的功能,通过它实现了原子操作。再次强调,由于 CAS 是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说 CAS 是一条 CPU 的原子指令,不会造成所谓的数据不一致问题。
核心代码:
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);
} while (!compareAndSwapInt(o, offset, v, v + delta));
return v;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统