首页 > 其他 > 详细

原子类

时间:2020-07-03 16:11:30      阅读:57      评论:0      收藏:0      [点我收藏+]

AtomicInteger

getAndSet方法   修改值并返回旧值

public final int getAndSet(int newValue) {
        return unsafe.getAndSetInt(this, valueOffset, newValue);   //调用unsafe的方法
    }
public final int getAndSetInt(Object var1, long var2, int var4) { 
        int var5;
        do { 
            var5 = this.getIntVolatile(var1, var2);  //通过对象及value的偏移地址来获得value的值
        } while(!this.compareAndSwapInt(var1, var2, var5, var4)); // var1 对象本身 var2 偏移地址 var 5 旧值 var4 新值 这样就可以原子的修改value的值

        return var5;
    }

在类加载时就会执行静态代码块里的代码,valueOffset就是value在内存中的地址,也就是偏移地址

static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

 

compareAndSet方法

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

原子类

原文:https://www.cnblogs.com/lzh66/p/13230656.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!