千家信息网

Java原子操作类源码分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Java原子操作类源码分析",在日常操作中,相信很多人在Java原子操作类源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java原子操作类源码
千家信息网最后更新 2026年11月01日Java原子操作类源码分析

这篇文章主要介绍"Java原子操作类源码分析",在日常操作中,相信很多人在Java原子操作类源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java原子操作类源码分析"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们先来看一下部分源码:

public class AtomicLong extends Number implements java.io.Serializable {    private static final long serialVersionUID = 1927816293512124184L;    //1.获取Unsafe类实例    private static final Unsafe unsafe = Unsafe.getUnsafe();    //2.存放value的偏移量    private static final long valueOffset;    static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();    //3.用于判断是否支持Long类型无锁CAS    private static native boolean VMSupportsCS8();    static {        try {            //4.获取value在AtomicLong中的偏移量            valueOffset = unsafe.objectFieldOffset                (AtomicLong.class.getDeclaredField("value"));        } catch (Exception ex) { throw new Error(ex); }    }    //5.实际变量值    private volatile long value;    /**     * Creates a new AtomicLong with the given initial value.     *     * @param initialValue the initial value     */    public AtomicLong(long initialValue) {        value = initialValue;    }    ············省略部分代码·············}

上面代码中,代码1处通过Unsafe.getUnsafe()获取到Unsafe类的实例(因为AtomicLong类是在rt.jar包下面的,AtomicLong类就是通过Bootstarp类加载器进行加载的)。代码5处,value被声明为volatile类型,保证内存的可见性。通过代码2,4获取value变量在AtomicLong类中的偏移量。

接下来介绍一下AtomicLong中的主要函数:

  • 递增和递减代码

//调用unsafe方法,设置value=value+1后,返回原始的值public final long getAndIncrement() {    return unsafe.getAndAddLong(this, valueOffset, 1L);}//调用unsafe方法,设置value=value-1后,返回原始的值public final long getAndDecrement() {    return unsafe.getAndAddLong(this, valueOffset, -1L);}//调用unsafe方法,设置value=value+1后,返回递增后的值public final long incrementAndGet() {    return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;}//调用unsafe方法,设置value=value-1后,返回递减后的值public final long decrementAndGet() {    return unsafe.getAndAddLong(this, valueOffset, -1L) - 1L;}

上面的四个函数内部都是通过调用Unsafe的getAndAddLong方法来实现操作,这个函数是个原子性操作,这里第一个参数是AtomicLong实例的引用的,第二个参数是value变量在AtomicLong的偏移值,第三个参数是要设置的第二个变量的值。

其中getAndIncrement()方法在JDK7中实现逻辑为:

public final long getAndIncrement() {    while(true) {        long current = get();        long next = current + 1;        if (compareAndSet(current, next))            return current;    }}

如上代码中,每个线程是先拿到变量的当前值(由于value是volatile变量,所以这是获取的最新值),然后在工作内存中对其进行增1操作,而后使用CAS修改变量的值,如果设置失败,则循环继续尝试,直到设置成功。

JDK8中的逻辑为:

public final long getAndIncrement() {        retrturn unsafe.getAndAddLong(this, valueOffset, 1L);    }

其中JDK8中的unsafe.getAndAddLong的代码为:

public final long getAndAddLong(Object var1, long var2, long var4) {   long var6;   do {       var6 = this.getLongVolatile(var1, var2);   } while(!this.compareAndSwapLong(var1, var2, var6, var6 + var4));   return var6;}

从中可以看到,JDK7中的AtomicLong中循环逻辑已经被JDK8中的原子操作类Unsafe内置了。

  • boolean compareAndSet(long expect,long update)

public final boolean compareAndSet(long expect,long update) {    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);}

函数在内部调用了unsafe.compareAndSwapLong方法。如果原子变量中的value值等于expect,则使用update值更新该值并返回true,否则返回false。

到此,关于"Java原子操作类源码分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

代码 方法 原子 变量 源码 分析 函数 偏移 学习 参数 实例 逻辑 原始 接下来 内存 更多 类型 部分 面的 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 互联网科技企业 互联网科技工作委员会 北京路客互联网科技有限公司 科技赋能下的互联网金融 厦门中拓互联网络科技有限公司 智能科技公司是互联网公司吗 嘟嘟瓜互联网科技 鑫亿盛互联网科技 广州互联网络科技有限公司 壕鑫互联网络科技 互联网金融科技委员会 滨湖区互联网智能科技产品供应 湖南一路畅行互联网科技 乌鲁木齐新华智原互联网科技学校 阿里互联网科技企业 广州富喜互联网络科技 互联网领先科技成果宣传视频 互联网科技创业计划的风险分析 知域互联网科技有限公司官网 新华互联网科技学校 A股互联网金融科技公司 青岛互联网科技公司 亿人帮互联网科技 科技赋能互联网健康 南平创想时代互联网科技有限公司 互联网科技公司营业执照怎么办理 张召忠谈中国互联网科技 互联网科技融合创新 科技互联网专业工作会议发言稿
0