AtomicReferenceFieldUpdater介绍 作用 原理 2. 如何使用 AtomicReferenceFieldUpdater 3. AtomicReferenceFieldUpdater 的优点 4. 注意事项 5. AtomicReferenceFieldUpdater用场景 6. AtomicReferenceFieldUpdater介绍 作用 AtomicReferenceFieldUpdater是一个抽象的工具类,用于原子地更新某个类的指定volatile引用字段。 创建一个AtomicReferenceFieldUpdater实例,指定要更新的类和字段。 使用提供的AtomicReferenceFieldUpdater实例来原子地更新字段。 AtomicReferenceFieldUpdater 的优点 减少内存占用:与原子类相比,AtomicReferenceFieldUpdater通常使用较少的内存。
概要 AtomicReferenceFieldUpdater 比 AtomicReference 用起来稍微有些麻烦,可大佬为什么更喜欢它? 是挂起点定义时经常需要用到的一个用来保证结果正常返回的类,它当中有个成员 result,这个成员由于可能被多个线程访问,因此存在保证线程安全的要求,不过奇怪的是, SafeContinuation 的开发者选择使用 AtomicReferenceFieldUpdater AtomicReference<String>("") } class UseAtomicFieldUpdater { companion object { val valueUpdater = AtomicReferenceFieldUpdater.newUpdater 通过使用工具粗略估算这两个类的实例占用内存的大小,前者约 103B,后者约 29B,对于后者来说,用以保证修改原子性的 valueUpdater 是个共享的对象,因此对于可能创建较多实例的场景,应当考虑优先使用 AtomicReferenceFieldUpdater 而 SafeContinuation 恰好就是一个经常被创建的类型,因此使用 AtomicReferenceFieldUpdater 能极大的减少内存压力。 ----
文章被收录于专栏:云时代Java开发:原理、实战与优化第一章:设计哲学——为何需要AtomicReferenceFieldUpdater? 1.3AtomicReferenceFieldUpdater的核心价值AtomicReferenceFieldUpdater提供了一个近乎完美的折中方案:展开代码语言:TXTAI代码解释publicclassTradingBot AtomicReferenceFieldUpdater凭借其通用性、零内存开销和无锁特性,成为支撑这种动态性的理想工具。 解决方案:使用AtomicReferenceFieldUpdater来管理策略字段。 结语:通用无锁协作的终极轻量级方案AtomicReferenceFieldUpdater<T,V>是Java并发工具箱中通用性最强、内存效率最高的原子更新器。
下面我们看一下AtomicReferenceFieldUpdater类的使用,我们有时不想更新对象的所有属性,只想更新某一个字段,并且我们知道字段的返回值类型也有可能是不确定的,所以Java并发工具包里为我们提供了很多字段的更新类型 除此之外我们还知道字段的类型还可能是引用类型,那我们就可以用AtomicReferenceFieldUpdater类来更新某一个引用类型的字段,这几个更新字段的类的使用方法几乎一样,所以下面只演示AtomicReferenceFieldUpdater 下面我们看一下AtomicIntegerFieldUpdater类的使用,它比AtomicReferenceFieldUpdater类简单了一点。 ? ? ?
AtomicReferenceFieldUpdater:原子更新引用类型里的字段。 AtomicMarkableReference:原子更新带有标记位的引用类型。 <User, String> userStringAtomicReferenceFieldUpdater = AtomicReferenceFieldUpdater.newUpdater( AtomicReferenceFieldUpdater:AtomicReferenceFieldUpdater 允许对特定类的特定字段进行原子更新操作。 它可以像AtomicReference 那样原子性地更新引用对象,同时允许在更新引用的同时原子操作一个布尔标记位,类似于AtomicReferenceFieldUpdater 但更为方便和简单。 因此,可以说AtomicMarkableReference 包含了AtomicReference 和 AtomicReferenceFieldUpdater 的功能,同时简化了在需要同时更新引用对象和标记位时的操作
AtomicReferenceFieldUpdater 案例演示 AtomicReferenceFieldUpdater是一个基于反射的类,它允许原子更新指定类的指定voltile字段。 代码演示如下: public class AtomicExample7 { /** * 引用类型 AtomicReferenceFieldUpdater */ private static AtomicReferenceFieldUpdater referenceFieldUpdater = AtomicReferenceFieldUpdater.newUpdater(Teacher.class AtomicMarkableReference 状态: false 当前返回状态 状态: true AtomicMarkableReference 状态: false 总结 本章节通过案例演示了原子引用AtomicReference、AtomicReferenceFieldUpdater
对象属性类型的原子类 对象属性类型的原子类包含:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater newUpdater方法 public static AtomicLongFieldUpdater newUpdater(Class tclass, String fieldName) //AtomicReferenceFieldUpdater 的newUpdater方法 public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class tclass, //AtomicLongFieldUpdater的compareAndSet()方法 compareAndSet(T obj, long expect, long update) //AtomicReferenceFieldUpdater 另外,需要注意的是:使用AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater更新对象的属性时,对象属性必须是
NettyResponseFuture.class, "onThrowableCalled"); @SuppressWarnings("rawtypes") private static final AtomicReferenceFieldUpdater <NettyResponseFuture, TimeoutsHolder> TIMEOUTS_HOLDER_FIELD = AtomicReferenceFieldUpdater . NettyResponseFuture.class, TimeoutsHolder.class, "timeoutsHolder"); @SuppressWarnings("rawtypes") private static final AtomicReferenceFieldUpdater <NettyResponseFuture, Object> PARTITION_KEY_LOCK_FIELD = AtomicReferenceFieldUpdater .newUpdater
NettyResponseFuture.class, "onThrowableCalled"); @SuppressWarnings("rawtypes") private static final AtomicReferenceFieldUpdater <NettyResponseFuture, TimeoutsHolder> TIMEOUTS_HOLDER_FIELD = AtomicReferenceFieldUpdater . NettyResponseFuture.class, TimeoutsHolder.class, "timeoutsHolder"); @SuppressWarnings("rawtypes") private static final AtomicReferenceFieldUpdater <NettyResponseFuture, Object> PARTITION_KEY_LOCK_FIELD = AtomicReferenceFieldUpdater .newUpdater
stampedReference.getReference()); } } 原子更新属性 AtomicIntegerFieldUpdater:原子更新整型的字段的更新器 AtomicLongFieldUpdater:原子更新长整型字段的更新器 AtomicReferenceFieldUpdater public class AtomicReferenceFieldUpdaterTest { // 创建原子更新器,并设置需要更新的对象类和对象的属性 private static AtomicReferenceFieldUpdater <Stu, String> atomicUserFieldRef = AtomicReferenceFieldUpdater.newUpdater(Stu.class, String.class, "name 以下是 AtomicReferenceFieldUpdater 的源码内容: if (vclass.isPrimitive()) throw new
就需要使用原子更新字段类,Atomic包提供了以下4个类进行原子字段更新 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicStampedReference、AtomicReferenceFieldUpdater longFieldUpdater.compareAndSet(testStu, 1L, 100L); System.out.println("id=" + testStu.getId()); AtomicReferenceFieldUpdater <Student, String> referenceFieldUpdater = AtomicReferenceFieldUpdater.newUpdater(Student.class, String.class
///////////////////////// true true true true true true true true true true false 12 30 1.3.4 字段更新器 AtomicReferenceFieldUpdater thread "main" java.lang.IllegalArgumentException: Must be volatile type at java.util.concurrent.atomic.AtomicReferenceFieldUpdater <init>(AtomicReferenceFieldUpdater.java:348) at java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater (AtomicReferenceFieldUpdater.java:110) at com.renex.c8.test2.main(test2.java:16) 示例代码: public class <Student, String> updater = AtomicReferenceFieldUpdater .newUpdater(Student.class, String.class
return true; } } } } } } 4.3 原子域更新 AtomicReferenceFieldUpdater (该字段不能是private的) 通过调用AtomicReferenceFieldUpdater的静态方法newUpdater就能创建它的实例,该方法要接收三个参数: 包含该字段的对象的类 将被更新的对象的类 将被更新的字段的名称 AtomicReferenceFieldUpdater updater=AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class
AtomicLongArray AtomicLongFieldUpdater AtomicMarkableReference AtomicReference AtomicReferenceArray AtomicReferenceFieldUpdater 对象的属性修改原子类 AtomicIntegerFieldUpdater 原子更新对象中int类型字段的值 AtomicLongFieldUpdater 原子更新对象中Long类型字段的值 AtomicReferenceFieldUpdater //资源类 class MyVar { public volatile Boolean isInit = Boolean.FALSE; AtomicReferenceFieldUpdater <MyVar,Boolean> referenceFieldUpdater = AtomicReferenceFieldUpdater.newUpdater(MyVar.class 使用AtomicReferenceFieldUpdater可以保证有且只有一次初始化执行 */ 5.你在哪里用了volatile AtomicReferenceFieldUpdater(相当有含金量的回答
(3)AtomicReferenceFieldUpdater 原子更新对象中的引用类型字段。 这几个类的操作基本类似,都需要传入要更新的字段名称,基本用法如下: private static void testAtomicReferenceField() { AtomicReferenceFieldUpdater <User, String> updateName = AtomicReferenceFieldUpdater.newUpdater(User.class, String.class,"name");
,在这个包中还有三个类在jdk1.5中都存在了,但是经常被大家忽略,这就是filedUpdater: AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater 我觉得这样做有点乱,使用filedUpdater来说更加容易理解, protected volatile byte buf[]; private static final AtomicReferenceFieldUpdater <BufferedInputStream, byte[]> bufUpdater = AtomicReferenceFieldUpdater.newUpdater (BufferedInputStream.class
AtomicIntegerFieldUpdater:原子更新整形字段的值 AtomicLongFieldUpdater:原子更新长整形字段的值 AtomicReferenceFieldUpdater : 上面三个类提供的方法几乎相同,所以我们这里以AtomicReferenceFieldUpdater为例子来介绍。 调用AtomicReferenceFieldUpdater静态方法newUpdater创建AtomicReferenceFieldUpdater对象 public static <U, W> AtomicReferenceFieldUpdater Demo5 demo5 = new Demo5(); //isInit用来标注是否被初始化过 volatile Boolean isInit = Boolean.FALSE; AtomicReferenceFieldUpdater <Demo5, Boolean> updater = AtomicReferenceFieldUpdater.newUpdater(Demo5.class, Boolean.class, "isInit
<CLHLock, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock.class, CLHNode.class node = null; } } MCSLock package com.example.concurrence.lock;import java.util.concurrent.atomic.AtomicReferenceFieldUpdater <MCSLock, MCSNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(MCSLock.class, MCSNode.class valueCheck(update); /**this.offset = U.objectFieldOffset(field);初始化构造时写入 public static <U,W> AtomicReferenceFieldUpdater <CLHLockWithBlock, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLockWithBlock.class,
原子操作在并发编程中是很重要的概念之一,java中的并发的原子操作和各种锁的实现都少不了CAS的影子,本文从AtomicReferenceFieldUpdater类的使用开始说起,由浅入深,层层深挖,最终挖到硬件来描述并发领域中的最重要的概念 目录: 1、AtomicReferenceFieldUpdater的使用。 2、AtomicReferenceFieldUpdater源码分析。 3、CAS基本介绍。 4、CAS 底层原理。 5、CAS的缺点 使用 AtomicReferenceFieldUpdater是一个针对Java引用类型中的字段进行原子更新的工具类,它能对指定类的指定的volatile引用字段进行原子更新(注意这个字段不能是 通过调用AtomicReferenceFieldUpdater的静态方法newUpdater就能创建它的实例,该方法要接收三个参数: 包含该字段的对象的类 将被更新的对象的类 @CallerSensitive 其实这里就是实例化了一个 AtomicReferenceFieldUpdater的实现类:AtomicReferenceFieldUpdaterImpl。
4.原子操作对象字段 AtomicIntegerFieldUpdater:整型数据字段更新器 AtomicLongFieldUpdater:长型数据字段更新器 AtomicReferenceFieldUpdater 所以,我们应当使用AtomicReferenceFieldUpdater。 volatile Performance performance; /** * 学生成绩“更改者” */ // 会重点讲解关于“更改器”的参数问题 private AtomicReferenceFieldUpdater <Student, Performance> performance_updater = AtomicReferenceFieldUpdater.newUpdater(Student.class updater,而不是直接设置performance属性 performance_updater.set(this, performance); } ...... } AtomicReferenceFieldUpdater.newUpdater