前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AtomicInteger 源码分析

AtomicInteger 源码分析

作者头像
itliusir
发布2020-01-31 11:25:52
4700
发布2020-01-31 11:25:52
举报
文章被收录于专栏:刘君君刘君君

摘要:

  1. AtomicInteger 是怎么做到线程安全的
  2. AtomicInteger 是怎么实现自增的

TOP 带着问题看源码

  1. AtomicInteger 是怎么做到线程安全的
  2. AtomicInteger 是怎么实现自增的

1. 基本介绍

AtomicInteger 扩展了 Number,适用于基于数字的处理,并提供了如原子递增等,适合一些计数场景

代码语言:javascript
复制
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); }
}

private volatile int value;

可以看到 value 是采用 volatile 修饰的,并通过 Unsafe 类获取 value 的偏移量,方便后续使用 CAS 操作

2. 自增 & 自减

代码语言:javascript
复制
// 获取 & 自增
public final int getAndIncrement() {
    return unsafe.getAndAddInt(this, valueOffset, 1);
}
// 自增 & 获取
public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
// 获取 & 自减
public final int getAndDecrement() {
    return unsafe.getAndAddInt(this, valueOffset, -1);
}
// 自减 & 获取
public final int decrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
}

AtomicInteger 提供了自增/自减的两个场景方法,一个返回旧值,一个返回新增/自减后的。

实际都是通过Unsafe 的 getAndAddInt 方法来实现的,可以看到实际上 getAndAddInt 就是一个 cas + 自旋操作来实现。

代码语言:javascript
复制
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;
}

回到 TOP 问题1 2 可以看到实际是采用 CAS + 自旋来实现线程安全的自增

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TOP 带着问题看源码
  • 1. 基本介绍
  • 2. 自增 & 自减
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档