AtomicInteger源码

Atomic原子类,可以对相应的操作执行原子操作。主要分为以下几种:
1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;
2. 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;
3. 引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;
4. 对象的属性修改类型: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 。

本文只分析基本类型。
AtomicInteger类与其他几个原子类实现方式类似,只分析其源码

1 类变量&常量

    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;  

    static {        //通过Unsafe操作,得到value值,赋给valueOffset
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value; //volatile类型,表示“值”

2 构造方法

    public AtomicInteger() {
    }

    //有初始值的构造方法
    public AtomicInteger(int initialValue) {
        value = initialValue;
    }

3 重要方法

3.1 get方法,final类型,返回valuepublic final int get() {
        return value;
    }
3.2 set方法,final类型,设置valuepublic final void set(int newValue) {
        value = newValue;
    }
3.3 lazySet方法,最后设置为给定值。延时设置变量值,这个等价于set()方法,但
是由于字段是volatile类型的,因此此字段的修改会比普通字段(非volatile字段)有
稍微的性能延时(尽管可以忽略),所以如果不是想立即读取设置的新值,允许在“后台
”修改值,那么此方法就很有用。
    public final void lazySet(int newValue) {
        unsafe.putOrderedInt(this, valueOffset, newValue);
    }
3.4 getAndSet方法,以原子方式设置当前value值,并返回旧值   
    public final int getAndSet(int newValue) {
        return unsafe.getAndSetInt(this, valueOffset, newValue);
    }
3.5  compareAndSet方法,以原子方式实现比较valueOffset和expect的值,若相等则
用update来替换valueOffset的值;否则直接返回不修改   
    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
3.6  与compareAndSwapInt类似 
    public final boolean weakCompareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
3.7 getAndIncrement方法,以原子方式实现将valueOffset+1,返回旧值   
    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }
3.8 getAndDecrement方法,以原子方式实现将valueOffset-1,返回旧值    
    public final int getAndDecrement方法() {
        return unsafe.getAndAddInt(this, valueOffset, -1);
    }
3.9 getAndAdd,以原子方式实现将valueOffset+delta,返回旧值  
    public final int getAndAdd(int delta) {
        return unsafe.getAndAddInt(this, valueOffset, delta);
    }
3.10 incrementAndGet方法,原子性的将当前值加1后,返回新值
    public final int incrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }
3.11 decrementAndGet,以原子方式实现将valueOffset-1,返回新值    
    public final int decrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
    }
3.12  addAndGet方法,以原子方式实现将valueOffset+delta,返回新值
    public final int addAndGet(int delta) {
        return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
    }
3.13 intValue方法,返回当前valuepublic int intValue() {
        return get();
    }

“`

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值