原子类AtomicInteger

在Java中,有很多方法可以保证多线程下数据的安全,AtomicXXXX这些类就是其中的一种,原子类,可以保证每一步操作都是原子操作。这次就对AtomicInteger的源码进行学习。

首先看一下这个类的类变量和成员变量:

//类变量 unsafe类【java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作】
//这里的这个变量就是用来进行cpu级别的原子操作。
private static final Unsafe unsafe = Unsafe.getUnsafe();
//这个变量实际上是由下面的static块来赋值的,可以由赋值看出来,这个值是下面的value属性在每个AtomikInteger对象中的位置偏移量,用这个值既可以找到在具体每个对象的内存中的内存地址。
private static final long valueOffset;static {try {valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }
}
//volatile修饰,AtomicInteger的值,在直接内存中,多个线程下可以直接获取值。
private volatile int value;

看完了这个类的内部的变量,其实大概可以猜到这个类怎么完成的原子操作了,使用volatile修饰的value来存储值,保证每个线程都可以随时读到值,然后每一步操作都使用CAS(compare and swap)这样即可以保证一直能原子写入,下面来看看源码到底是不是这样。

来看一下incrementAndGet这个方法,实际上就是++i的操作,但是保证原子性。

 public final int incrementAndGet() {//用get出来的值+1,前面的方法是unsafe中实现的 i++。对value属性进行操作。return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}//Unsafe中的。这个方法可以看到一直在做do-while,直到CAS成功(获取AtomicInteger对象上的value属性,然后CAS检查保证值是var5的时候将他变成var5+1)。
//其中getIntVolatile和compareAndSwapInt 都是native方法,用C写的。CAS底层貌似是使用了cpu的cpxchg(compare*change)。
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;
}

总结

所有其他的方法都大同小异,使用volatile修饰的value来存储值,保证每个线程都可以随时读到值,然后每一步操作都使用CAS(compare and swap)这样即可以保证原子写入。

源码学习【原子类AtomicInteger】Java原子类底层实现(解释详细)相关推荐

  1. Java并发包源码学习系列:同步组件CountDownLatch源码解析

    文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...

  2. 蜘蛛纸牌java注释_GitHub - tangguangyao/SpiderSolitaire: 蜘蛛纸牌源码学习+注释

    SpiderSolitaire 蜘蛛纸牌源码学习+注释 源码分析思路: 首先,用了2个构造函数Spider和Poker Spider构造函数拥有以下方法: init:函数初始化 start:游戏开始 ...

  3. JAVA JDK 源码学习

    JAVA JDK 源码学习 ,以1.8为例,按照下面图片顺序依次学习: applet ,awt,beans,io,lang,math,net,nio,rmi,security,sql,text,tim ...

  4. Java 源码学习系列(三)——Integer

    Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还 ...

  5. Java多线程之JUC包:Semaphore源码学习笔记

    若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...

  6. java Integer 源码学习

    转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...

  7. JAVA小项目实例源码—学习娱乐小助手

    代码地址如下: http://www.demodashi.com/demo/11456.html 一.程序实现 项目目录: MyJFrame:实现项目界面样式: AppProcess:实现调用api或 ...

  8. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  9. Java 中 Integer 源码学习之缓存池了解

    Java 中 Integer 源码学习之缓存池了解 面试题 new Integer(123) 与 Integer.valueOf(123) 的区别? new Integer(123) 每次都会新建一个 ...

  10. 直播系统源码,使用python批量生成原比例缩略图

    直播系统源码,使用python批量生成原比例缩略图 from PIL import Imagedef smallPic():for i in range(1,51):filename = " ...

最新文章

  1. linux命令join与paste
  2. 机器学习笔记(五)神经网络
  3. iPhone开发各种图标大小
  4. 06-Java 本地文件操作
  5. spring—aop
  6. 图的邻接矩阵(C语言实现)
  7. tf.concat, np.concatenate
  8. linux 输入8个字母进行排序,Linux排序命令sort详解
  9. iOS 报错 : dyld: Library not loaded: @rpath/
  10. summernote富文本编辑器配合validate表单验证无法进行表单提交的问题
  11. 四阶龙格库塔法(Runge-Kutta)求解常微分方程的 Matlab程序及案例
  12. C++ 类的封装继承多态
  13. excel随机数_如何返回1至10之间的不重复随机数
  14. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(中)
  15. 360一键wifi共享 v5.3 绿色免费版​
  16. 《信号与系统学习笔记》—线性时不变系统(一)
  17. VR分享会邀请函 | 如何利用VR影像创造商业应用新价值?
  18. LocalDateTime生成当天、当月起止时间的时间戳
  19. 2021年计算机试题,2021年计算机试题及答案-20210515145837.doc-原创力文档
  20. 戴森全新V12 Detect Slim轻量无绳吸尘器中国首发

热门文章

  1. python类中方法调用自己类的方法_python怎么调用类方法
  2. 基于LSTM的股票价格预测(完整金融类代码)
  3. 期末复习、化学反应工程科目(第八、九章)
  4. 十、深入Java字符串(下篇)
  5. ACL 2021 | 北京大学KCL实验室:如何利用双语词典增强机器翻译?
  6. CVPR 2019 | PoolNet:基于池化技术的显著性目标检测
  7. POJ3614Sunscreen(优先队列+贪心)
  8. 求取给定的二叉树的镜像_17---二叉树的镜像
  9. unity随机方向的代码_ECCV 2020 目前用于车辆重识别(vehicle reID)中最大的合成车辆数据集(代码开源)...
  10. Java实现单链表的反转