java并发编程(十二)----(JUC原子类)数组类型介绍
上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray。其中前两个的使用方式差不多,AtomicReferenceArray因为他的参数为引用数组,所以跟前两个的使用方式有所不同。
1.AtomicLongArray介绍
对于AtomicLongArray, AtomicIntegerArray我们还是只介绍一个,另一个使用方式大同小异。
我们先来看看AtomicLongArray的构造函数和方法:
构造函数:
AtomicLongArray(int length) //创建给定长度的新 AtomicLongArray。
AtomicLongArray(long[] array) //创建与给定数组具有相同长度的新 AtomicLongArray,并从给定数组复制其所有元素。
方法:
long addAndGet(int i, long delta) //以原子方式将给定值添加到索引 i 的元素。
boolean compareAndSet(int i, long expect, long update) //如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
long decrementAndGet(int i) //以原子方式将索引 i 的元素减1。
long get(int i) //获取位置 i 的当前值。
long getAndAdd(int i, long delta) //以原子方式将给定值与索引 i 的元素相加。
long getAndDecrement(int i) //以原子方式将索引 i 的元素减 1。
long getAndIncrement(int i) //以原子方式将索引 i 的元素加 1。
long getAndSet(int i, long newValue) //以原子方式将位置 i 的元素设置为给定值,并返回旧值。
long incrementAndGet(int i) // 以原子方式将索引 i 的元素加1。
void lazySet(int i, long newValue)// 最终将位置 i 的元素设置为给定值。
int length() //返回该数组的长度。
void set(int i, long newValue) //将位置 i 的元素设置为给定值。
String toString() //返回数组当前值的字符串表示形式。
2.使用方式:
我们可以发现AtomicLongArray的使用方式和上一篇介绍的基本类型的原子类差不多,无非是换成了数组类型,另外方法里面的etAndAdd与ncrementAndGet我们要注意使用方式。
3.AtomicReferenceArray介绍
我们来看一下他的方法:
构造方法:
AtomicReferenceArray(E[] array) //创建与给定数组具有相同长度的新 AtomicReferenceArray,并从给定数组复制其所有元素。
AtomicReferenceArray(int length) // 创建给定长度的新 AtomicReferenceArray。
方法:
boolean compareAndSet(int i, E expect, E update) //如果当前值 == 预期值,则以原子方式将位置 i 的元素设置为给定的更新值。
E get(int i) //获取位置 i 的当前值。
E getAndSet(int i, E newValue) // 以原子方式将位置 i 的元素设置为给定值,并返回旧值。
void lazySet(int i, E newValue) //最终将位置 i 的元素设置为给定值。
int length() //返回该数组的长度。
void set(int i, E newValue) // 将位置 i 的元素设置为给定值。
String toString() //返回数组当前值的字符串表示形式。
boolean weakCompareAndSet(int i, E expect, E update) // 如果当前值 == 预期值,则以原子方式将位置 i 的元素设置为给定的更新值。
由上我们可以看到AtomicReferenceArray与前两个的方法相比少了很多。
下面我们通过一个小例子来看一下他的使用:
public class AtomicReferenceArrayTest {
public static void main(String[] args) {
Long[] l = new Long[4];
String[] s = new String[4];
int[] i = new int[4];
Integer[] in = new Integer[4];
AtomicReferenceArray atomicReferenceArray = new AtomicReferenceArray(l);
System.out.println(atomicReferenceArray.length());
System.out.println(atomicReferenceArray.get(2));
AtomicReferenceArray atomic = new AtomicReferenceArray(4);
atomic.set(0,432141);
atomic.set(2,"fsafefeq");
atomic.set(3,i);
System.out.println(atomic.toString());
}
}
输出结果为:
exclude patterns:
4
null
[432141, null, fsafefeq, [I@357b2b99]
Process finished with exit code 0
说明:
1.当我们使用AtomicReferenceArray(E[] array)这个构造方法传入一个数组对象时,该数组对象必须是引用类型,int[]不可以,但是Integer[]的可以。
2.当我们使用AtomicReferenceArray(int length)这个构造函数的时候,只要为他指定了数组大小之后,你为数组的每一位设置什么值是没有要求的,类似于Map的形式。
java并发编程(十二)----(JUC原子类)数组类型介绍的更多相关文章
- java并发编程(十一)----(JUC原子类)基本类型介绍
上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong ...
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
- java多线程系类:JUC原子类:03之AtomicLongArray原子类
概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...
- Java并发编程(二)如何保证线程同时/交替执行
第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...
- java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...
- java并发编程工具类JUC第七篇:BlockingDeque双端阻塞队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- java并发编程工具类JUC第八篇:ConcurrentHashMap
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍
阅读<Java并发编程实践>一书后整理的思维导图.
- java并发编程(十)----JUC原子类介绍
今天我们来看一下JUC包中的原子类,所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程),原子操作可以是 ...
随机推荐
- SQLServer性能优化之---数据库级日记监控
上节回顾:https://www.cnblogs.com/dotnetcrazy/p/11029323.html 4.6.6.SQLServer监控 脚本示意:https://github.com/l ...
- Codeforces Gym101097I:Sticks (思维)
http://codeforces.com/gym/101097/attachments 题意:现在有k种颜色的木棍,每种颜色有ni根木棍,每根木棍有一个长度,问是否有三根木棍可以组成三角形,并且这三 ...
- 每天学点node系列-zlib
永不放弃,永不放弃又有两个原则,第一个原则是永不放弃,第二个原则就是:当你想放弃时回头看第一个原则. 概览 做过web性能优化的同学,对性能优化大杀器gzip应该不陌生.浏览器向服务器发起资源请求,比 ...
- 使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用
先看效果图 github地址 github仓库 在线访问 初始化项目 #创建项目 create-react-app applist #如果没有安装create-react-app的话,先安装 npm ...
- 多线程总结-同步之volatile关键字
目录 1 案例引出可见性 2 案例引出原子性 1 案例引出可见性 代码解析:新起一个子线程执行m()方法,1秒后主线程将b置为false,子线程是否会停止执行死循环while(b){},打印" ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- CDQZ集训DAY10 日记
又一次跪了,跪在了神奇的数据范围上. T1上来打完暴力之后觉得是数据结构题,像三维偏序,于是开始往各种数据结构上想,主席树,线段树+calc,平衡树,树套树,CDQ……最终在经过一番思考之后选择去打C ...
- CDQZ集训DAY9 日记
彻彻底底的爆炸了…… 考试上来第一题看完30分暴力后就不知道怎么打了,然后看第二题,一开始脑残以为是网络流,后来发现是树状结构后觉得是那个经典的n^2的树上背包DP,然而脑子又一次犯笨,竟然,竟然去枚 ...
- .Net微信网页开发之JSSDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解
前言: 因为接下来会有几篇关于微信JS-SDK功能使用的文章,主要会对微信分享,获取设备信息,获取地理位置,微信扫一扫这几个功能进行讲解.而这几个功能都是围绕着微信JS-SDK实现的,首先使用微信JS ...
- 快速掌握mongoDB(四)—— C#驱动MongoDB用法演示
前边我们已经使用mongo shell进行增删查改和聚合操作,这一篇简单介绍如何使用C#驱动MongoDB.C#驱动MongoDB的本质是将C#的操作代码转换为mongo shell,驱动的API也比 ...