AtomicInteger源码解析
时间:2022-07-23
本文章向大家介绍AtomicInteger源码解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Java并发编程里不得不提java提供的高并发工具包,JUC包提供丰富的并发编程工具类,因此学习Java并发编程,JUC包就是学习的基础。在学习JUC包之前,我们先了解一下JUC的基本功能模块.
JUC并发包的基本结构体系
atomic包:基于CAS策略的的原子类包。
locks包:是基于AQS的抽象队列的同步框架,提供并发编程的同步锁。
并发容器:提供高并发条件下的数据存储。
并发计算框架:提供多线程执行框架。
并发工具:实现上述框架的工具类。
AtomicInteger的实现原理
AtomicInteger采用基于CAS进行数据的原子性操作的Unsafe工具类,Unsafe类通过在对象实例化的时候记录数据的地址,并通过比较获取的原有数据与新获取数据是否一致来确定数据是否被其他线程修改,从而进行相关的数据操作。而对于数据的可见性,AtomicInteger采用volatile关键字进行修饰,使得线程对数据的操作均作用于主存,从而保证数据在多线程之间的可见性。AtomicInteger的初始化如下所示。
//java操作内存的工具类,采用CAS能够操作内存。
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); }
}
//采用Volatile关键字来管理数据,volatile提供数据的可见性。
//volatile底层采用汇编指令load,cpu直接通过操作主存来控制所修饰的数据。
private volatile int value;
AtomicInteger提供的主要接口
AtomicInteger提供基本的数据操作,对于复杂的数据操作,其提供了lambda 表达式进行支持。我们只需将必要的逻辑写到lambda中即可。以下是AtomicInteger提供的主要接口。
//先获取值,然后进行赋值
public final int getAndSet(int newValue);
//时候用CAS进行判断原数据是否被其他线程修改了
//如果被修改了则返回false,否则进行数据更新
public final boolean compareAndSet(int expect, int update);
//先获取,再进行加一赋值
public final int getAndIncrement();
//先获取,再进行减一赋值
public final int getAndDecrement();
//先获取,再进行加法赋值
public final int getAndAdd(int delta);
//先加一,再获取值
public final int incrementAndGet();
//先减一,再获取值
public final int decrementAndGet();
//添加再获取
public final int addAndGet(int delta);
//采用CAS进行赋值
public final int getAndUpdate(IntUnaryOperator updateFunction);
//更新赋值
public final int updateAndGet(IntUnaryOperator updateFunction);
//获取之后,进行复杂的数值操作
public final int getAndAccumulate(int x,
IntBinaryOperator accumulatorFunction);
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- c语言之define和typedef的区别
- TSINGSEE青犀视频官网全新改版即将上线,系统界面迎来整体升级
- c语言之带参数的宏定义
- spring AOP之基于xml配置文件的方式来配置AOP
- 基于TypeScript封装Axios笔记(五)
- spring之操作数据库之使用JdbcTemplate和JdbcDaoSupport
- 修改Markdown神器[Typora]的主题样式
- 视频压缩原理入门
- spring之为什么要使用事务?(一)
- Mysql 如何实现全文检索,关键词跑分
- spring之操作数据库之使用NamedParameterJdbcTemplate(具名参数)
- 谷歌colab上安装百度paddlepaddle框架
- 谷歌colab运行paddlepaddle之手写数字识别
- 【python-leetcode112-树的深度遍历】路径总和
- spring之第一个spring程序