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原子类-数组类型(三)相关推荐

  1. java 原子数据类型_java并发编程(十一)----(JUC原子类)基本类型介绍

    上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong ...

  2. JUC原子类-基本类型(二)

    AtomicLong介绍: AtomicLong是作用是对长整形进行原子操作. 在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子 ...

  3. 【Java_多线程并发编程】JUC原子类——4种原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2. 数组类型: Ato ...

  4. Java多线程系列--“JUC原子类”01之 框架

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--"JUC原子类"01之 框架 根据修改的数据类型,可以将JUC包中的原子操作类可以分 ...

  5. Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类

    概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...

  6. 并发笔记(八)JUC原子类以及线程池(Executors)

    一.原子类 JUC中提供了针对一个变量的修改的简单原子操作,提供了原子类,相对于我们自己采用锁的方式实现来说,原子类的性能更好. 1.1原子类的底层实现原理理论:volatile+(循环的CAS) C ...

  7. JUC原子类-框架(一)

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 数组类型: AtomicInteger ...

  8. juc原子类之五:AtomicLongFieldUpdater原子类

    概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法 ...

  9. Java多线程系列---“JUC原子类”02之 框架

    转自:http://www.cnblogs.com/skywang12345/p/3514589.html 根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: Atomi ...

最新文章

  1. linux slocate(secure locate) 命令详解
  2. uinty中对Xml文件的操作
  3. 【转】Beagleboard:BeagleBoneBlack
  4. python data frame_Python dataframer包_程序模块 - PyPI - Python中文网
  5. 构思新巧的173dmba飞鸽
  6. 1.4编程基础之逻辑表达式与条件分支 18 点和正方形的关系
  7. 研究大学生基础课程成绩和专业课程成绩的关系,证明两者之间是否有线性关系
  8. 【渝粤题库】陕西师范大学292231 财务管理Ⅱ 作业(专升本)
  9. 基础知识巩固五(问题)
  10. 通达信最新 行情服务器,【图】我是如何打造普通行情比l2还快速的通达信行情服务器_股票公式,股票软件,股票论坛,炒股公式,股票_股票软件技术交流论坛_理想论坛 - 股票论坛...
  11. 尚硅谷redis6文档,代码
  12. 大数据与人工智能结课论文
  13. Web功能测试(邮箱,手机号,验证码,身份证号测试用例)
  14. Facebook联手纽约大学,要把核磁共振成像时间缩短10倍
  15. 所有最好的Google幻灯片键盘快捷键
  16. 蚂蚁的愤怒之源(微风拂面)-中篇
  17. windows的Alt键一直处于按下状态,解决,亲测有用
  18. TPC-H和TPC-DS
  19. 常见问题及解决方法1
  20. Extjs新手教程代码

热门文章

  1. 漫游kafka实战篇之搭建Kafka开发环境
  2. lcx源代码以及免杀的研究
  3. Golang 常见设计模式之选项模式
  4. 经典算法刷题笔记pdf
  5. Java代码优化:使用构造函数和使用一个setter的效率差别
  6. 这里有一份面筋请查收(二)
  7. Cocos2d-x Win7环境编译apk
  8. 旋转排序数组系列题详解
  9. 沉浸式视频技术应用与挑战
  10. 使用VoiceFliter-Lite改进设备上的语音识别