资讯专栏INFORMATION COLUMN

AtomicInteger的decrementAndGet方法简单分析

JasonZhang / 1681人阅读

摘要:调用获取字段在对象中的偏移量其实就是一个字段到对象头部的偏移量,通过这个偏移量可以快速定位字段定义为类型,保证在多线程中的可见性调用参数为当前对象,偏移量,操作值最后是由于获取的值为交换前的值通过返回循环获取最新内存值方法包含两个参数

unsafe.objectFieldOffset

调用unsafe.objectFieldOffset获取value字段在对象中的偏移量(其实就是一个字段到对象头部的偏移量,通过这个偏移量可以快速定位字段)

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

定义value为volatile类型,保证value在多线程中的可见性

private volatile int value;
decrementAndGet

调用unsafe.getAndAddInt,参数为当前对象,偏移量,操作值

/**
 * Atomically decrements by one the current value.
 *
 * @return the updated value
 */
public final int decrementAndGet() {
    //最后-1是由于getAndAddInt获取的值为交换前的值
    return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
}

getAndAddInt

通过compareAndSwapInt返回循环getIntVolatile获取最新内存值

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;
}

getIntVolatile

方法包含两个参数,当前对象,偏移量;获取内存地址指向的整数,并支持volatile语义

public native int getIntVolatile(Object var1, long var2);

compareAndSwapInt

方法包含了四个参数,当前对象,偏移量,期望值,新值;如果当前对象对应偏移量的值与期望值相同,则把当前对象的值更改为新值,并返回true;否则返回false

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73340.html

相关文章

  • 聊聊ElasticsearchSizeBlockingQueue

    摘要:序本文主要研究一下的继承了,同时实现了接口它的构造器要求输入及参数有个类型的参数用于记录的大小,它在等方法都会维护这个参数其中方法会判断当前是否大于等于,如果大于等于则直接返回而方法则直接抛出继承了,它提供了一个线程安全的方法 序 本文主要研究一下Elasticsearch的SizeBlockingQueue SizeBlockingQueue elasticsearch-7.0.1/...

    iliyaku 评论0 收藏0
  • AtomicInteger原理

    摘要:提供这些原子类的目的就是为了解决基本类型操作的非原子性导致在多线程并发情况下引发的问题。测试代码引发的线程问题最终的值为如果是原子操作,那么结果应该就是,反复运行几次发现结果大部分情况下都不是,这也证明了的非原子性在多线程下产生的问题。 AtomicInteger的原理 java的并发原子包里面提供了很多可以进行原子操作的类,比如: AtomicInteger AtomicBoole...

    tuantuan 评论0 收藏0
  • Java™ 教程(原子变量)

    原子变量 java.util.concurrent.atomic包定义了支持单个变量的原子操作的类,所有类都有get和set方法,类似于对volatile变量的读写操作,也就是说,set与在同一个变量上任何后续的get具有先发生关系,compareAndSet原子方法也具有这些内存一致性特性,适用于整数原子变量的简单原子算法也是如此。 要查看如何使用此包,让我们返回我们最初用于演示线程干扰的Cou...

    bang590 评论0 收藏0
  • java并发实战:连接池实现

    摘要:池化技术简介在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的这样就保证了在多用户情况下只能使用指定数目的资 池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵...

    XboxYan 评论0 收藏0
  • Java多线程进阶(十三)—— J.U.C之atomic框架:AtomicInteger

    摘要:顾名思义,是类型的线程安全原子类,可以在应用程序中以原子的方式更新值。创建对象先来看下对象的创建。也就是说当一个线程修改一个共享变量时,其它线程能立即读到这个修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首发于一世流云的专栏:https://segmentfault.com/blog... ...

    darkbug 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<