开篇

  AtomicInteger位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。
 Atomicxxxx系列主要核心在于Unsafe这个类的运用保证线程安全,而Unsafe这个类应该是通过JNI调用的底层实现。
  关于unsafe类可以看看揭秘sun.misc.Unsafe,虽然我还是没怎么看懂。记住unsafe这个东西很重要,不过据说在jdk9之后应该会被弃用了。

AtomicInteger类构造器

 AtomicInteger类构造器有两个:

  • 无参构造函数采用默认值初始化为0
  • 有参数构造函数直接用initialValue来value的
  • AtomicInteger的关键逻辑在于static代码快中通过unsafe接口初始化value的内存地址,后续直接通过内存地址进行操作。

 另外我们需要注意到value是用volatile进行修饰保证变量的可见性,这个有空一定要仔细研究研究。

public class AtomicInteger extends Number implements java.io.Serializable {private static final long serialVersionUID = 6214790243416807050L;// setup to use Unsafe.compareAndSwapInt for updatesprivate 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值初始化为initialValuepublic AtomicInteger(int initialValue) {value = initialValue;}// value的值为默认值为0public AtomicInteger() {}
}

AtomicInteger的get操作

 AtomicInteger的get操作还是比较有意思的,总共非几大类:

  • get()方法直接返回值
  • getAndIncrement()、getAndDecrement()、getAndAdd()、getAndUpdate()先返回旧值后对旧值执行加减操作。
  • incrementAndGet()、decrementAndGet()、addAndGet()、updateAndGet()先执行加减操作后返回新值。
  • 底层操作unsafe.getAndAddInt()的实现细节借助于unsafe的compareAndSwapInt()方法保证只有在旧值为v的情况下才能更新为v+delta值。
    public final int getAndAddInt(Object o, long offset, int delta) {int v;do {v = getIntVolatile(o, offset);} while (!compareAndSwapInt(o, offset, v, v + delta));return v;}---------------------------------------------------------------public final int get() {return value;}public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}public final int getAndDecrement() {return unsafe.getAndAddInt(this, valueOffset, -1);}public final int getAndAdd(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta);}public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;}public final int getAndAccumulate(int x,IntBinaryOperator accumulatorFunction) {int prev, next;do {prev = get();next = accumulatorFunction.applyAsInt(prev, x);} while (!compareAndSet(prev, next));return prev;}---------------------------------------------------------------public final int incrementAndGet() {return unsafe.getAndAddInt(this, valueOffset, 1) + 1;}public final int decrementAndGet() {return unsafe.getAndAddInt(this, valueOffset, -1) - 1;}public final int addAndGet(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta) + delta;}public final int updateAndGet(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return next;}public final int accumulateAndGet(int x,IntBinaryOperator accumulatorFunction) {int prev, next;do {prev = get();next = accumulatorFunction.applyAsInt(prev, x);} while (!compareAndSet(prev, next));return next;}

AtomicInteger的set操作

 AtomicInteger的set操作基本上也分为两大类:

  • 直接set设置value值
  • 通过unsafe的api接口实现原子性写操作
    public final int getAndAddInt(Object o, long offset, int delta) {int v;do {v = getIntVolatile(o, offset);} while (!compareAndSwapInt(o, offset, v, v + delta));return v;}------------------------------------------------------------------public final void set(int newValue) {value = newValue;}public final void lazySet(int newValue) {unsafe.putOrderedInt(this, valueOffset, newValue);}public final int getAndSet(int newValue) {return unsafe.getAndSetInt(this, valueOffset, newValue);}public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}public final boolean weakCompareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}

参考文章

揭秘sun.misc.Unsafe
非阻塞同步算法与CAS(Compare and Swap)无锁算法
为什么volatile不能保证原子性而Atomic可以?
彻底了解内存屏障

java源码-AtomicInteger相关推荐

  1. Java源码详解六:ConcurrentHashMap源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 数据的存储 构造函数 哈希 put get 扩容 本系列是Java详解,专栏地址:Java源码分析 ConcurrentHashMap 官方文档:ConcurrentH ...

  2. Java源码详解四:String源码分析--openjdk java 11源码

    文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...

  3. Java源码详解五:ArrayList源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 构造函数 add操作 扩容函数 remove函数 subList函数 总结 本系列是Java详解,专栏地址:Java源码分析 ArrayList 官方文档:ArrayL ...

  4. Java源码详解三:Hashtable源码分析--openjdk java 11源码

    文章目录 注释 哈希算法与映射 线程安全的实现方法 put 操作 get操作 本系列是Java详解,专栏地址:Java源码分析 Hashtable官方文档:Hashtable (Java Platfo ...

  5. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  6. Java源码详解零:HashMap介绍

    文章目录 Java详解(0):HashMap介绍,HashMap的迭代,HashMap的线程安全问题 HashMap介绍 HashMap的迭代 HashMap的线程安全问题 Java详解(0):Has ...

  7. Java源码下载和阅读(JDK1.8/Java 11)

    文章目录 1.openjdk的Java源码 2. Oracle 的Java源码 1.openjdk的Java源码 JDK10的源码可以直接从openjdk上下载.下载地址:openjdk-10_src ...

  8. java源码保护技术,sourceguard

    sourceguard 项目记录了本人对java源码保护的一些探索实践. 项目结构 sourceguard-repack 实现原始jar文件的解包,对目标class文件加密和还原成jar文件 sour ...

  9. java源码 - ReentrantReadWriteLock介绍

    开篇  ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWrite ...

最新文章

  1. hdu4849 最短路
  2. NTU 课程笔记:CV6422 样本分布
  3. 计算机视觉、机器学习、人工智能领域知识汇总
  4. 51nod 1270 数组的最大代价 思路:简单动态规划
  5. 【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty
  6. 实训09.08:简单的算法练习
  7. 计算机控制开关,开关电源的计算机控制系统
  8. Python使用心得之魔法参数**kw
  9. 各种数字推理题解题技巧
  10. vue 动态添加组件
  11. 一篇关于视频下载的技术贴(源码)
  12. 移动增值业务随笔(2)
  13. win11本地安装docker
  14. poweriso 红旗linux,下载PowerISO
  15. 搜题公众号怎么搭建制作(微信公众号查题搭建制作教程)
  16. 什么是智能微电网?智能微电网有什么特点?
  17. 044-赛灵思-0FPGA-简单实用
  18. 区块链正在改变金融行业和其他行业的未来
  19. 《大厂高并发分布式锁从入门到实战》第3讲之Redisson分布式锁
  20. Candence Virtuoso Schematic常用快捷键

热门文章

  1. python remove函数_Python列表的remove方法的注意事项
  2. php的auth权限类源码
  3. P2P中的NAT穿越方案
  4. python 传奇服务端_传奇游戏服务器源码学习
  5. mysql jpa默认值_Spring JPA-枚举中枚举字段的默认值
  6. linuxmove命令_linux中mv命令使用详解
  7. Java equalsIgnoreCase() 方法
  8. python将列表写入文件_Python将列表数据写入文件(txt, csv,excel)
  9. c字符串分割成数组_数组与字符串
  10. 期末C语言45分能过的吗,C语言—期末小黄衫获奖感言