对于volatile变量,写的时候会将线程本地内存的数据刷新到主内存上,读的时候会将主内存的数据加载到本地内存里,所以可以保证可见行和单个读/写操作的原子性。但是上例中先 1. 判断!ischanged 2.ischanged=true 该组合操作就不能保证原子性了,也就是说线程A A1->A2 线程B B1->B2(第一个操作为volatile读或者第二个操作为volatile写的时候,编译器不会对两个语句重排序,所以最后的执行顺序满足顺序一致性模型的),但是最后的执行结果可能是A1->B1->A2->B2
AtomicIntegerFieldUpdater:原子更新整形字段的更新器 AtomicLongFieldUpdater:原子更新长整形字段的更新器 AtomicReferenceFieldUpdater 举个栗子 AtomicIntegerFieldUpdater 类使用示例 上面三个类提供的方法几乎相同,所以我们这里以 AtomicIntegerFieldUpdater为例子来介绍。 通过两个方法的结果来直观感受 一个是使用了AtomicIntegerFieldUpdater类来达到整形变量CAS原子更新。 <DemoBean> atom = AtomicIntegerFieldUpdater.newUpdater(DemoBean.class, "inte"); DemoBean bean 在使用了AtomicIntegerFieldUpdater原子更新后,inte最终结果为10000没有错。 而第二个方法,没有使用任何技术实现原子更新,可以看出inte的结果小于10000
之前我们看了AtomicInteger和AtomicIntegerArray的源码,今天主要解析一下AtomicIntegerFieldUpdater,从字面上看这个类的主要作用就是原子性质的更新Integer AtomicIntegerFieldUpdater的使用方式 ? AtomicIntegerFieldUpdater需要通过先创建特定类的更新器,然后使用这个更新器再去针对该类的Integer字段进行操作,所以AtomicIntegerFieldUpdater其实就是一个针对对象中 是一个虚类,AtomicIntegerFieldUpdaterImpl继承了AtomicIntegerFieldUpdater并实现了AtomicIntegerFieldUpdater提供的虚函数,在newUpdater 除此之外,AtomicIntegerFieldUpdater还将java8提供的lamda表达式直接放置到AtomicIntegerFieldUpdater中,而将计算结果的赋值操作放置到AtomicIntegerFieldUpdaterImpl
如AtomicIntegerFieldUpdater类和AtomicLongFieldUpdater类,前者就是更新Integer类型的字段后者就是更新Long类型字段的。 下面我们看一下AtomicIntegerFieldUpdater类的使用,它比AtomicReferenceFieldUpdater类简单了一点。 ? ? ?
本篇文章不会教你怎么用AtomicIntegerFieldUpdater类,也不会给你讲解里面的机制,本篇只是最直观的提供一个demo,来让你直观的感知到原子更新类的效果 What is AtomicIntegerFieldUpdater AtomicIntegerFieldUpdater就是用来更新某一个实例对象里面的int属性的。 对于AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改int/long类型的字段,不能修改其包装类型(Integer/Long)。 在使用了AtomicIntegerFieldUpdater原子更新后,inte最终结果为10000没有错。 如果你对AtomicIntegerFieldUpdater类有兴趣,可以去查看其他作者的技术文献,本篇内容的目的仅仅是直观感受这个类在并发编程中的其中一个作用。
1.3AtomicIntegerFieldUpdater的核心价值AtomicIntegerFieldUpdater提供了一个近乎完美的折中方案:展开代码语言:TXTAI代码解释publicclassPlayer AtomicIntegerFieldUpdater的内存效率和无锁特性使其成为管理这些状态的理想选择。 解决方案:使用AtomicIntegerFieldUpdater来管理这些状态字段。 AtomicIntegerFieldUpdater的零额外开销特性,使其成为构建内存高效型虚拟线程应用的首选。 结语:内存与性能的精妙平衡术AtomicIntegerFieldUpdater<T>是Java并发库中一件精巧的工艺品。
一、AtomicIntegerFieldUpdater简介 AtomicIntegerFieldUpdater是Java并发包java.util.concurrent.atomic中的一个类,它利用反射机制 AtomicIntegerFieldUpdater:不需要为每个实例创建AtomicIntegerFieldUpdater对象,而是创建一个静态的AtomicIntegerFieldUpdater实例来更新所有实例的指定字段 二、使用AtomicIntegerFieldUpdater的步骤 字段声明: 被更新的字段必须是volatile int类型,这是使用AtomicIntegerFieldUpdater的前提条件。 创建Updater: 使用AtomicIntegerFieldUpdater.newUpdater()静态方法创建一个AtomicIntegerFieldUpdater实例。 三、AtomicIntegerFieldUpdater的优势 减少内存占用: 使用AtomicIntegerFieldUpdater可以避免为每个需要原子更新的字段创建一个AtomicInteger
, "redirectCount"); @SuppressWarnings("rawtypes") private static final AtomicIntegerFieldUpdater< > IS_DONE_FIELD = AtomicIntegerFieldUpdater .newUpdater(NettyResponseFuture.class, "isDone" ); @SuppressWarnings("rawtypes") private static final AtomicIntegerFieldUpdater<NettyResponseFuture > IN_AUTH_FIELD = AtomicIntegerFieldUpdater .newUpdater(NettyResponseFuture.class, "inAuth" > CONTENT_PROCESSED_FIELD = AtomicIntegerFieldUpdater .newUpdater(NettyResponseFuture.class
, "redirectCount"); @SuppressWarnings("rawtypes") private static final AtomicIntegerFieldUpdater< > IS_DONE_FIELD = AtomicIntegerFieldUpdater .newUpdater(NettyResponseFuture.class, "isDone" ); @SuppressWarnings("rawtypes") private static final AtomicIntegerFieldUpdater<NettyResponseFuture > IN_AUTH_FIELD = AtomicIntegerFieldUpdater .newUpdater(NettyResponseFuture.class, "inAuth" > CONTENT_PROCESSED_FIELD = AtomicIntegerFieldUpdater .newUpdater(NettyResponseFuture.class
3. volatile + AtomicIntegerFieldUpdater实现CAS:netty中的应用 参考张龙netty教程的P.81~P.84 先说结论:volatile + AtomicIntegerFieldUpdater 但如果能用volatile + AtomicIntegerFieldUpdater的方法实现,就能减少存储。 你只需要维护一个静态变量AtomicIntegerFieldUpdater,并为需要用到CAS操作的int值声明为volatile即可。 但如果我们用volatile int + AtomicIntegerFieldUpdater,只需先为静态变量AtomicIntegerFieldUpdater分配空间,然后每个实例只需要占用4字节即可 正因为如此,netty使用了AtomicIntegerFieldUpdater来实现引用计数的CAS。
通过AtomicintegerFieldUpdater安全的修改自定义对象 atomic包中提供AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater AtomicIntegerFieldUpdater 通过CAS修改变量值 package com.keytech.task; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater 源码分析 public abstract class AtomicIntegerFieldUpdater<T> { /** * * @param tclass 持有某字段的类 <Rumenz> rumenzReferenceAge= AtomicIntegerFieldUpdater.newUpdater(Rumenz.class,"age"); private static AtomicIntegerFieldUpdater<Rumenz> rumenzReferenceName= AtomicIntegerFieldUpdater.newUpdater(Rumenz.class
比如下面的小例子就实现了线程安全,代码如下: import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; public class AtomicTest <AtomicTest> lockUpdate = AtomicIntegerFieldUpdater.newUpdater(AtomicTest.class, "lock"); public 内部通过反身,得到需要操作的字段,同样是利用Unsafe类来实现CAS的操作,newUpdater相关源码如下: //这个类是abstract, 不能构造对象 public abstract class AtomicIntegerFieldUpdater <T> { @CallerSensitive public static AtomicIntegerFieldUpdater newUpdater(Class tclass //这个类外部不能够访问,属于private private static class AtomicIntegerFieldUpdaterImpl<T> extends AtomicIntegerFieldUpdater
jack', password='***'} 2.3 AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray 提供对对应类型数组的原子更新 2.4 AtomicIntegerFieldUpdater 不管字段修饰符是public/protected/private 对于父类的字段,子类是不能直接操作的,尽管子类可以访问到父类的字段 只要是实例变量,不能是类变量,也就是说不能加static关键字 对于AtomicIntegerFieldUpdater AtomicReferenceFieldUpdater import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater void main(String[] args) throws InterruptedException { DemoBean obj = new DemoBean(); AtomicIntegerFieldUpdater <DemoBean> atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(DemoBean.class
[lake_card_mindmap1.png] 小试牛刀 AtomicIntegerFieldUpdater案例演示 原子地更新整形字段类,还是那个懵懂少年,在修改自己的票数。 getTicketNum() { return ticketNum; } } public class AtomicExample8 { private static AtomicIntegerFieldUpdater <Teacher> integerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(Teacher.class, "ticketNum"); AtomicIntegerFieldUpdater 和 AtomicIntegerFieldUpdater 方法基本类似,方法getAndIncrement()、getAndDecrement()、getAndAdd student2---你的校园网正在尝试重新连接...... student2---修改成功与否:true 当前 stamp:4 student2---当前课程已选人数:100 总结 本章简单了介绍了 AtomicIntegerFieldUpdater
oldVal + 1; atomicLongArray.compareAndSet(index, oldVal, newVal); }}原子化的对象属性更新器原子化的对象属性更新器有:AtomicIntegerFieldUpdater public class ClassName { AtomicIntegerFieldUpdater<Employee> fieldUpdater = AtomicIntegerFieldUpdater.newUpdater // AtomicIntegerFieldUpdater 类中的代码if (field.getType() !
对象属性类型的原子类 对象属性类型的原子类包含:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater //AtomicIntegerFieldUpdater的newUpdater方法 public static AtomicIntegerFieldUpdater newUpdater(Class vclass, String fieldName) 这里,我们不难看出,在AtomicIntegerFieldUpdater //AtomicIntegerFieldUpdater的compareAndSet()方法 compareAndSet(T obj, int expect, int update) //AtomicLongFieldUpdater 另外,需要注意的是:使用AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater更新对象的属性时,对象属性必须是
为此,Java并发包(JUC)提供了AtomicLongFieldUpdater<T>——AtomicIntegerFieldUpdater的64位兄弟。 本文将带你深入AtomicLongFieldUpdater<T>的源码核心,剖析其与AtomicIntegerFieldUpdater的异同,特别是64位操作在32位平台上的特殊挑战,并探讨其在AIAgent 1.2AtomicIntegerFieldUpdater的局限AtomicIntegerFieldUpdater只能处理32位的int。 第二章:源码全景——64位原子性的实现奥秘2.1创建与安全性检查AtomicLongFieldUpdater的创建过程与AtomicIntegerFieldUpdater高度相似,但针对long类型进行了专门化 结语:高精度与内存效率的完美融合AtomicLongFieldUpdater<T>是AtomicIntegerFieldUpdater在64位领域的完美延伸。
AtomicIntegerFieldUpdater AtomicIntegerFieldUpdater类的主要作用是让普通变量也享受原子操作。 AtomicIntegerFieldUpdater就是为了解决这样的问题产生的。 int score) { this.score = score; } } public final static AtomicIntegerFieldUpdater <V> vv = AtomicIntegerFieldUpdater.newUpdater(V.class, "score"); public static AtomicInteger "score="+stu.getScore()); System.out.println("allscore="+allscore); } } 上述代码将score使用 AtomicIntegerFieldUpdater
2.4 对象的属性修改类型 除了原子更新对象(引用类型)外,atomic中还提供了更新对象的属性字段的原子类: AtomicIntegerFieldUpdater:原子更新整形字段的更新器; AtomicLongFieldUpdater 实现起来较上面几种类型略微复杂一下,大概分为两步; 步骤1️⃣通过静态方法newUpdater创建一个更新器,并且设置想要更新的类和字段; 步骤2️⃣字段必须使用public volatile进行修饰; 以 AtomicIntegerFieldUpdater public class TestAtomicIntegerFieldUpdater { //创建一个age的更新器 private static AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(User.class,"age"); public static void main(String userName + '\'' + ", age=" + age + '}'; } } 通过AtomicIntegerFieldUpdater.newUpdater
.class, "setupTrialMutex"); public final static AtomicIntegerFieldUpdater<DateBenchMark_jmhType_B2> tearTrialMutexUpdater = AtomicIntegerFieldUpdater.newUpdater(DateBenchMark_jmhType_B2.class, "tearTrialMutex .class, "setupIterationMutex"); public final static AtomicIntegerFieldUpdater<DateBenchMark_jmhType_B2 .class, "setupInvocationMutex"); public final static AtomicIntegerFieldUpdater<DateBenchMark_jmhType_B2 > tearInvocationMutexUpdater = AtomicIntegerFieldUpdater.newUpdater(DateBenchMark_jmhType_B2.class, "