JUC原子类-数组类型(三)
AtomicLongArray介绍:
AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似。本章以AtomicLongArray对数组类型的原子类进行介绍。内容包括:
AtomicLong函数列表
// 创建给定长度的新 AtomicLongArray。
AtomicLongArray(int length)
// 创建与给定数组具有相同长度的新 AtomicLongArray,并从给定数组复制其所有元素。
AtomicLongArray(long[] array)// 以原子方式将给定值添加到索引 i 的元素。
long addAndGet(int i, long delta)
// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean compareAndSet(int i, long expect, long update)
// 以原子方式将索引 i 的元素减1。
long decrementAndGet(int i)
// 获取位置 i 的当前值。
long get(int i)
// 以原子方式将给定值与索引 i 的元素相加。
long getAndAdd(int i, long delta)
// 以原子方式将索引 i 的元素减 1。
long getAndDecrement(int i)
// 以原子方式将索引 i 的元素加 1。
long getAndIncrement(int i)
// 以原子方式将位置 i 的元素设置为给定值,并返回旧值。
long getAndSet(int i, long newValue)
// 以原子方式将索引 i 的元素加1。
long incrementAndGet(int i)
// 最终将位置 i 的元素设置为给定值。
void lazySet(int i, long newValue)
// 返回该数组的长度。
int length()
// 将位置 i 的元素设置为给定值。
void set(int i, long newValue)
// 返回数组当前值的字符串表示形式。
String toString()
// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean weakCompareAndSet(int i, long expect, long update)
incrementAndSet方法:
public final long incrementAndGet(int i) {return addAndGet(i, 1);
}
addAndGet()
public long addAndGet(int i, long delta) {// 检查数组是否越界long offset = checkedByteOffset(i);while (true) {// 获取long型数组的索引 offset 的原始值long current = getRaw(offset);// 修改long型值long next = current + delta;// 通过CAS更新long型数组的索引 offset的值。if (compareAndSetRaw(offset, current, next))return next;}
}j
说明:addAndGet()首先检查数组是否越界。如果没有越界的话,则先获取数组索引i的值;然后通过CAS函数更新i的值。
getRaw()源码如下:
private long getRaw(long offset) {return unsafe.getLongVolatile(array, offset);
}
unsafe是通过Unsafe.getUnsafe()返回的一个Unsafe对象。通过Unsafe的CAS函数对long型数组的元素进行原子操作。如compareAndSetRaw()就是调用Unsafe的CAS函数,它的源码如下:
private boolean compareAndSetRaw(long offset, long expect, long update) {return unsafe.compareAndSwapLong(array, offset, expect, update);
}
JUC原子类-数组类型(三)相关推荐
- java 原子数据类型_java并发编程(十一)----(JUC原子类)基本类型介绍
上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong ...
- JUC原子类-基本类型(二)
AtomicLong介绍: AtomicLong是作用是对长整形进行原子操作. 在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子 ...
- 【Java_多线程并发编程】JUC原子类——4种原子类
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2. 数组类型: Ato ...
- Java多线程系列--“JUC原子类”01之 框架
2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--"JUC原子类"01之 框架 根据修改的数据类型,可以将JUC包中的原子操作类可以分 ...
- Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类
概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...
- 并发笔记(八)JUC原子类以及线程池(Executors)
一.原子类 JUC中提供了针对一个变量的修改的简单原子操作,提供了原子类,相对于我们自己采用锁的方式实现来说,原子类的性能更好. 1.1原子类的底层实现原理理论:volatile+(循环的CAS) C ...
- JUC原子类-框架(一)
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 数组类型: AtomicInteger ...
- juc原子类之五:AtomicLongFieldUpdater原子类
概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法 ...
- Java多线程系列---“JUC原子类”02之 框架
转自:http://www.cnblogs.com/skywang12345/p/3514589.html 根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: Atomi ...
最新文章
- linux slocate(secure locate) 命令详解
- uinty中对Xml文件的操作
- 【转】Beagleboard:BeagleBoneBlack
- python data frame_Python dataframer包_程序模块 - PyPI - Python中文网
- 构思新巧的173dmba飞鸽
- 1.4编程基础之逻辑表达式与条件分支 18 点和正方形的关系
- 研究大学生基础课程成绩和专业课程成绩的关系,证明两者之间是否有线性关系
- 【渝粤题库】陕西师范大学292231 财务管理Ⅱ 作业(专升本)
- 基础知识巩固五(问题)
- 通达信最新 行情服务器,【图】我是如何打造普通行情比l2还快速的通达信行情服务器_股票公式,股票软件,股票论坛,炒股公式,股票_股票软件技术交流论坛_理想论坛 - 股票论坛...
- 尚硅谷redis6文档,代码
- 大数据与人工智能结课论文
- Web功能测试(邮箱,手机号,验证码,身份证号测试用例)
- Facebook联手纽约大学,要把核磁共振成像时间缩短10倍
- 所有最好的Google幻灯片键盘快捷键
- 蚂蚁的愤怒之源(微风拂面)-中篇
- windows的Alt键一直处于按下状态,解决,亲测有用
- TPC-H和TPC-DS
- 常见问题及解决方法1
- Extjs新手教程代码