juc原子类之五:AtomicLongFieldUpdater原子类
概要
AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法相似。本章以对基本类型的原子类进行介绍。内容包括:
AtomicLongFieldUpdater介绍和函数列表
AtomicLongFieldUpdater示例
AtomicLongFieldUpdater源码分析(基于JDK1.7.0_40)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514623.html
AtomicLongFieldUpdater介绍和函数列表
AtomicLongFieldUpdater可以对指定"类的 'volatile long'类型的成员"进行原子更新。它是基于反射原理实现的。
AtomicLongFieldUpdater函数列表
// 受保护的无操作构造方法,供子类使用。 protected AtomicLongFieldUpdater()// 以原子方式将给定值添加到此更新器管理的给定对象的字段的当前值。 long addAndGet(T obj, long delta) // 如果当前值 == 预期值,则以原子方式将此更新器所管理的给定对象的字段设置为给定的更新值。 abstract boolean compareAndSet(T obj, long expect, long update) // 以原子方式将此更新器管理的给定对象字段当前值减 1。 long decrementAndGet(T obj) // 获取此更新器管理的在给定对象的字段中保持的当前值。 abstract long get(T obj) // 以原子方式将给定值添加到此更新器管理的给定对象的字段的当前值。 long getAndAdd(T obj, long delta) // 以原子方式将此更新器管理的给定对象字段当前值减 1。 long getAndDecrement(T obj) // 以原子方式将此更新器管理的给定对象字段的当前值加 1。 long getAndIncrement(T obj) // 将此更新器管理的给定对象的字段以原子方式设置为给定值,并返回旧值。 long getAndSet(T obj, long newValue) // 以原子方式将此更新器管理的给定对象字段当前值加 1。 long incrementAndGet(T obj) // 最后将此更新器管理的给定对象的字段设置为给定更新值。 abstract void lazySet(T obj, long newValue) // 为对象创建并返回一个具有给定字段的更新器。 static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) // 将此更新器管理的给定对象的字段设置为给定更新值。 abstract void set(T obj, long newValue) // 如果当前值 == 预期值,则以原子方式将此更新器所管理的给定对象的字段设置为给定的更新值。 abstract boolean weakCompareAndSet(T obj, long expect, long update)
AtomicLongFieldUpdater示例
// LongTest.java的源码 import java.util.concurrent.atomic.AtomicLongFieldUpdater;public class LongFieldTest {public static void main(String[] args) {// 获取Person的class对象Class cls = Person.class; // 新建AtomicLongFieldUpdater对象,传递参数是“class对象”和“long类型在类中对应的名称”AtomicLongFieldUpdater mAtoLong = AtomicLongFieldUpdater.newUpdater(cls, "id");Person person = new Person(12345678L);// 比较person的"id"属性,如果id的值为12345678L,则设置为1000。mAtoLong.compareAndSet(person, 12345678L, 1000);System.out.println("id="+person.getId());} }class Person {volatile long id;public Person(long id) {this.id = id;}public void setId(long id) {this.id = id;}public long getId() {return id;} }
运行结果:
id=1000
AtomicLongFieldUpdater源码分析(基于JDK1.7.0_40)
AtomicLongFieldUpdater完整源码
下面分析LongFieldTest.java的流程。
1. newUpdater()
newUpdater()的源码如下:
public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) {Class<?> caller = Reflection.getCallerClass();if (AtomicLong.VM_SUPPORTS_LONG_CAS)return new CASUpdater<U>(tclass, fieldName, caller);elsereturn new LockedUpdater<U>(tclass, fieldName, caller); }
说明:newUpdater()的作用是获取一个AtomicIntegerFieldUpdater类型的对象。
它实际上返回的是CASUpdater对象,或者LockedUpdater对象;具体返回哪一个类取决于JVM是否支持long类型的CAS函数。CASUpdater和LockedUpdater都是AtomicIntegerFieldUpdater的子类,它们的实现类似。下面以CASUpdater来进行说明。
CASUpdater类的源码如下:
public boolean compareAndSet(T obj, long expect, long update) {if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj);return unsafe.compareAndSwapLong(obj, offset, expect, update); }
说明:它实际上是通过CAS函数操作。如果类的long对象的值是expect,则设置它的值为update。
转自:http://www.cnblogs.com/skywang12345/p/3514635.html
转载于:https://www.cnblogs.com/duanxz/p/3472544.html
juc原子类之五:AtomicLongFieldUpdater原子类相关推荐
- java 子类 父类 转换_Java子类与父类之间的类型转换
1.向上转换 父类的引用变量指向子类变量时,子类对象向父类对象向上转换.从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制. 2.向下转换 在父类变 ...
- 原神服务器维护,原神1.2版本更新出现9107是什么原因导致的?错误代码9107解决方案介绍...
原神9107是什么意思?最近原神已经更新到了1.2版本,很多小伙伴们都在更新时出现了错误代码9107,那么大家知道这是什么意思吗?该怎么解决吗?下面小编就为大家带来了原神9107解决办法介绍,希望能够 ...
- 【计算机组成原理】真值与机器值小数原码与整数原码定义及举例
[计算机组成原理]真值与机器值&小数原码与整数原码定义及举例 前言: 昨天受到了来自同事的冲击,希望有一天我也可以成为更加优秀的人,无论言谈举止.身心状态或是专业技能:现在要做的就是比 ...
- 学习原画时绘画原画人物需要掌握哪些技巧呢?
很多人学习原画,可是没有掌握其中的技巧,到头来也只是徒劳.学习原画设计对美术基础是有一定要求的,所以想要学好绘画原画人物,就要先学会几种具有代表性的相貌类型.就比如说,在描写人物肖像时,对人物进行归类 ...
- 【Java_多线程并发编程】JUC原子类——4种原子类
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2. 数组类型: Ato ...
- java三角形创建子类_如何创建子类,以便参数属于Java中的子类类型
我有抽象的父类Animal: public abstract class Animal { public abstract T copyAnimal(T animal); } 然后我想创建一个子类Du ...
- java反码补码原码作用_java原码补码反码关系解析
本文为大家解析了java原码补码反码的关系,供大家参考,具体内容如下 原码:不管源数据是十进制还是十六进制,统统将数字转成二进制形式 反码:把原码的二进制统统反过来,0变成1,1变成0 补码:负数的反 ...
- python创建子类_Python线程创建子类?
当我在python中使用线程时,我在思考创建子类的原因时遇到了一个问题.我看过很多网站,包括tutorialspoint.在 文档说您需要定义Thread类的一个新子类.我对类有一个基本的了解,但根本 ...
- mvc2中如何在下拉列表中显示含有子类的项(子类前加--)
如果要得到包含子类的项,理所当然要用到递归.下面的这个例子是在下拉列表中获取所有部门 helper中代码如下: 1 /// <summary> 2 /// 循环获取部门 3 /// < ...
最新文章
- 伸展树算法c语言,数据结构伸展树介绍及C语言的实现方法
- springapplication.run运行多个应用_编程的十二要素应用宣言
- 常用的函数式接口_Function接口练习_自定义函数模型拼接
- Taro+react开发(53) Taro提示操作
- Android studio使用手册说明
- springboot项目访问不到controller方法。
- Php二叉树对称,PHP如何实现判断二叉树是否对称
- 弗尤博客(十)之聊天室
- struts2中,在使用 convention 插件的情况下,如何使用 “chain” 这个resu
- Delphi XE3 下载
- 雅虎WEB前端网站优化
- 2020年的成长印记
- Outlook-VBA-05-自动获取邮件附件
- 电工与电子技术实验——单管交流电压放大电路
- Spring Cloud 2.2.2 源码之二十九nacos客户端获取配置原理四
- 万字说透 Decentraland:元宇宙的先行者
- c4d打开没反应_PS、AI、PR、AE、C4D零基础自学经验分享
- Elasticsearch 中的 Guice
- (马蹄集)直线切平面 线段 圆切平面
- esd静电保护器(ESD二极管)封装型号整理
热门文章
- 文件系统操作-分区及格式化、挂载
- 如何在win7上添加自动启动项
- 定义域图像用计算机怎么算,《计算机图像处理的数学和算法基础》.pdf
- mysql查看innodb版本_mysql中查看innodb版本的方法
- spark 把一列数据合并_Spark DataFrame列的合并与拆分
- 没有workstation_这才是Win10的旗舰版:WorkStation版独享功能测试
- C语言会生成字节码文件吗,什么是字节码文件?
- java x509certificate2_ASP.NET使用X509Certificate2出现一系列问题的解决方法
- 使用smo算法编写svm对CIFAR-10数据分类
- python可以做科学计算吗_python能做什么科学计算