Concurrent源码(一):AtomicInteger

最近准备认真看一下Concurrent包的源码,在这里也算做一下记录吧

作为java的并发包,Concurrent里首先提供了一些原子类,用于实现多线程下的线程同步。

先看AtomicInteger的成员变量和初始化方法

    // 用于进行更新操作
    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); }
    }

    //AtomicInteger的值
    private volatile int value;


    /**
     * 初始化方法
     */
    public AtomicInteger() {
    }

首先有两个静态成员变量,一个是Unsafe类(关于Unsafe的介绍可以看这篇技术博客https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html),它可以通过内存级别管理资源。而在类加载并初始化的过程中,通过Unsafe类可以得到私有成员变量value的内存偏移量。

    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

而在实现原子增加的时候,则会借助unsafe对象的getAndAddInt方法实现原子级别的加1

    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

在Unsafe类中,getAndAddInt则是通过cas的方法,首先获得内存现在的值var5,当对象var1内存偏移量为var2的值等于var5时,将var5+var4的值set到这个位置,compareAndSwapInt是native方法,通过保证compareAndSwapInt的原子性,来实现AtomicInteger原子性的增加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值