Concurrent——Atomic原子操作类
转载自https://blog.csdn.net/sdlyjzh/article/details/78587777
打算把Concurrent包下面的一些类整理一下。今天先从最简单的开始,Atomic原子类。
先看一下atomic包下的类
一共12个,共分四类:基本类型、数组、引用、属性。我们就按这四个分类,介绍一下它们的用途以及实现。
基本类型
包含上图红框里面的三个类。由于三个类提供的方法基本一致,下面以AtomicInterger为例。
AtomicInteger的常用方法如下:
实现逻辑都差不多,取当前值current,然后计算更改后的值。利用CAS思想,比较current和当前数值是否相等,如果相等,则更新,如果不相等,则重复上述操作。下面借助源码分析:
/*** Atomically increments by one the current value.** @return the previous value*/public final int getAndIncrement() {for (;;) {int current = get(); //获取当前值int next = current + 1; //执行加1操作if (compareAndSet(current, next))return current; //返回当前值}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
可以看出,通过compareAndSet
方法,保证原子操作。
public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}
- 1
- 2
- 3
调用Unsafe类的compareAndSwapInt方法。Unsafe类中方法为native方法,具体未看,原理就是利用CAS。
java有8个基本类型,而这里只有3个,那么其他5个如果也想原子操作呢?其实可以参考AtomicBoolean的实现,它先将boolean类型值转换成int。
数组
原子数组类型参见图中绿色框中的3个类。其底层实现逻辑和原子基本类型一致,这里我们看看如何使用数组类型。
static int[] value = new int[]{1,2};static AtomicIntegerArray ai = new AtomicIntegerArray(value);public static void main(String[] args){ai.getAndSet(0, 3);System.out.println(value[0]);System.out.println(ai.get(0));}
思考一下输出,再看结果:
1
3
是不是和你预想的不一样?传递的数组,为什么没有更改原始数组呢?AtomicIntegerArray会复制传递过来的数组,所以,AtomicIntegerArray修改内部数组元素时,不会影响传入的数组。
原子引用类型
3个原子引用类型,参加图中黄色框中的类。
- AtomicReference:原子引用类型
- AtomicStampedReference:原子带有版本号的引用类型
- AtomicMarkableReference:原子带有标记位的引用类型
原子字段类
参见上图未框住的3个类。
需要注意的是,因为原子字段类为抽象类,每次使用时,通过静态方法newUpdater()创建一个更新器,并且设置需要更新的类和属性。同时,更新类的字段必须用volatile修饰。
参考:《Java并发编程的艺术》
Concurrent——Atomic原子操作类相关推荐
- java.util.concurrent.atomic原子操作类包
2019独角兽企业重金招聘Python工程师标准>>> 这个包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当 ...
- 2-2-3-3、Atomic原子操作类详解
目录 Atomic原子操作类 作用 分类 基本类型 引用类型 数组类型 对象属性原子修改器 原子类型累加器(jdk1.8增加的类) 作用 性能测试 条件>>>>>> ...
- 并发编程-concurrent指南-原子操作类-AtomicBoolean
类AtomicBoolean 可以用原子方式更新的 boolean 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicBoolean 可用 ...
- 并发编程-concurrent指南-原子操作类-AtomicInteger
在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger 可以用原子方式更新的 ...
- 【JDK源码】java.util.concurrent.atomic包常用类详解
java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...
- Java原子操作类,你知道多少?
原子操作类简介 由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案. 实际上,在J.U.C下的atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去 更新基 ...
- Java高并发编程(九):Java中原子操作类
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量的方式. ...
- Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析
文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...
- Java Review - 并发编程_原子操作类原理剖析
文章目录 概述 原子变量操作类 主要方法 incrementAndGet .decrementAndGet .getAndIncrement.getAndDecrement boolean compa ...
最新文章
- NYOJ 17 单调递增最长公共子序列
- AndroidStudio gradle配置
- 让架构更简单,QCon上海2016热点前瞻
- 解决微服务在docker上部署后无法连接数据库的问题
- 华为 HR 内网 5000 字实名控诉:研发兄弟一个月加班 160 小时却被说不努力...
- 淘宝客优惠券领取微信小程序前台和后台源码
- h5将word转为html,怎么把Word版通知转化成H5版
- 打开程序员心理B面,这些黑红话题他们亲自回应丨1024特辑
- 雨果奖 与 星云奖 ------美国的两个科幻奖项
- 第7-9节项目2-歌手大奖赛计分系列(1)
- android跑马灯效果横向,Android 通过自定义View实现纵向跑马灯效果
- 行云Talk|开发工具一体化,在线IDE会不会成为一种趋势呢?
- 远期外汇交易的交割日
- TimX_Ch1与TimX_Ch1N的差异
- 何一娜:诺基亚软件开发工程师典型的一天
- 设计需求分析方法与过程
- 马宁伟-20年工作经验谈-3-十年磨一剑
- 从零开始的树莓派生活(树莓派4B的组装与系统安装)
- 页面自动弹出加qq对话框
- MySQL安装以及MySQL图像化工具Sqlyog的安装注册