Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AtomicInteger 源码分析

AtomicInteger 源码分析

作者头像
itliusir
发布于 2020-01-31 03:25:52
发布于 2020-01-31 03:25:52
50900
代码可运行
举报
文章被收录于专栏:刘君君刘君君
运行总次数:0
代码可运行

摘要:

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

TOP 带着问题看源码

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

1. 基本介绍

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
// 获取 & 自增
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java并发编程CAS
它的功能是判断内存某一个位置的值是否为预期,如果是则更改这个值,这个过程就是原子的。
一觉睡到小时候
2020/05/27
4970
AtomicInteger详解
因为在阻塞队列中LinkedBlockingQueue中对容量的维护使用了Atomic类,所以需要对该类学习下,如何使用AtomicInteger来保证线程操作的原子性。
虞大大
2020/08/26
1K0
死磕 java并发包之AtomicInteger源码分析
AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。
彤哥
2019/07/08
5910
java吧_死磕好不好
前面我们说到volatile不保证原子性,解决办法就是使用AtomicInteger代替int,但是为什么使用AtomicInteger就可以保证了原子性了,是因为AtomicInteger实现的就是CAS思想和Unsafe的支持。
全栈程序员站长
2022/08/04
8530
3分钟带你秒懂CAS实现机制
在 Java 的java.util.concurrent包中,除了提供底层锁、并发同步等工具类以外,还提供了一组原子操作类,大多以Atomic开头,他们位于java.util.concurrent.atomic包下。
Java极客技术
2024/06/11
2040
3分钟带你秒懂CAS实现机制
没用过Java原子类?我来手写一个AtomicInteger
大家可能听过「Automic」原子类,这些类在多线程下可以保证线程安全。比如想要实现自增,多线程下会出现少增加的情况。
Lvshen
2022/05/05
2630
没用过Java原子类?我来手写一个AtomicInteger
Java中CAS 基本实现原理「建议收藏」
了解CAS,首先要清楚JUC,那么什么是JUC呢?JUC就是java.util.concurrent包的简称。它有核心就是CAS与AQS。CAS是java.util.concurrent.atomic包的基础,如AtomicInteger、AtomicBoolean、AtomicLong等等类都是基于CAS。
全栈程序员站长
2022/09/08
1.2K0
Java中CAS 基本实现原理「建议收藏」
一篇搞定CAS,深度讲解,面试实践必备
在高并发的业务场景下,线程安全问题是必须考虑的,在JDK5之前,可以通过synchronized或Lock来保证同步,从而达到线程安全的目的。但synchronized或Lock方案属于互斥锁的方案,比较重量级,加锁、释放锁都会引起性能损耗问题。
程序新视界
2022/07/29
4350
一篇搞定CAS,深度讲解,面试实践必备
深入理解JUC:第二章:CAS:CompareAndSwap底层原理
线程对变量的读取赋值等操作,要先将变量从主内存拷贝自己线程的工作内存空间,在工作内存中进行操作,操作完成后再将变量写回主内存
Java廖志伟
2022/09/28
2170
深入理解JUC:第二章:CAS:CompareAndSwap底层原理
Java - CAS用法及说明
CAS即compare and swap,表示比较并交换,在java中依赖Unsafe类来实现,常见的CAS实现有AtomicInteger、AtomicLong、AtomicReference等,这些都是使用乐观锁的形式来实现多线程线程编程。 下面以AtomicInteger为例介绍:
夹胡碰
2020/12/23
1.1K0
AtomicInteger源码分析详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
6940
AtomicInteger源码分析详解
从 Atomicinteger来学习 Java的原子类
Java的concurrent包一直都是很重要的知识点,因为他是进阶高级工程师必备,而其中的atomic包中的原子类是最为经常使用到的,所以学习一下atomic下的一些类的源码.
呼延十
2019/07/01
5870
基于atomic包分析CAS原理
不想上来就贴上来千篇一律的各种概念,懂得人我不说也懂,不懂得看完概念依然不懂,用码说话,先看个小demo,开五个线程,每个线程累计1000次操作共享变量,共享变量分别使用int和基于CAS的AtomicInteger
用户6182664
2020/05/11
4130
AtomicInteger原子类原理解析
原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。
黑洞代码
2021/01/14
3500
AtomicInteger原子类原理解析
【死磕Java并发】—- 深入分析CAS
CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS同步组件、Atomic原子类操作等等都是以
芋道源码
2018/03/01
7920
【死磕Java并发】—- 深入分析CAS
Juc并发编程10——原子类与ABA问题解决方案
除了加锁以外,还可以使用原子类实现操作原子性。它底层采用CAS算法,使用简单、性能高效、线程安全。
半旧518
2022/10/26
3350
Juc并发编程10——原子类与ABA问题解决方案
cas 原理分析
顾名思义,就是很悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
全栈程序员站长
2022/11/03
3770
cas 原理分析
并发原子性之Atomic
Atomic原子操作类提供了一种用法简单, 性能高效, 线程安全的变量更新方式. 今天就以AtomicInteger为例,看看它是如何做到的. 在AtomicInteger中int值的封装是用vola
一个架构师
2022/06/20
5920
并发编程中cas的这三大问题你知道吗?
在java中cas真的无处不在,它的全名是compare and swap,即比较和交换。它不只是一种技术更是一种思想,让我们在并发编程中保证数据原子性,除了用锁之外还多了一种选择。
苏三说技术
2020/10/15
6660
并发编程中cas的这三大问题你知道吗?
CAS && AtomicInteger
AtomicInteger package java.util.concurrent.atomic; import java.util.function.IntUnaryOperator; import java.util.function.IntBinaryOperator; import sun.misc.Unsafe; public class AtomicInteger extends Number implements java.io.Serializable { private
大学里的混子
2019/03/31
7600
相关推荐
Java并发编程CAS
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验