开篇

 The AtomicReference class provides reference objects that may be read and written atomically, so when multiple threads try to reach them at the same time, only one will be able to do so.
换句话说就是AtomicReference提供Object对象的原子类操作,提供了更加灵活的操作

AtomicReference类和构造器

 AtomicReference的构造函数类构造器有两个:

  • 无参构造函数采用默认值初始化为0
  • 有参数构造函数直接用initialValue来value的

 AtomicReference类变量需要注意的两个点:

  • AtomicReference的关键逻辑在于static代码快中通过unsafe接口初始化value的内存地址,后续直接通过内存地址进行操作。
  • AtomicReference的value是用volatile进行修饰保证变量的可见性
public class AtomicReference<V> implements java.io.Serializable {private static final long serialVersionUID = -1848883965231344442L;private static final Unsafe unsafe = Unsafe.getUnsafe();// 保存AtomicLong中value的内存地址便于快速操作private static final long valueOffset;// 获取value的内存地址的逻辑操作static {try {valueOffset = unsafe.objectFieldOffset(AtomicReference.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}private volatile V value;// 以传入的initialValue初始化value对象public AtomicReference(V initialValue) {value = initialValue;}// 以传入的null初始化value对象public AtomicReference() {}
}

AtomicReference的get操作

 AtomicReference的get操作相比之前的AtomicLong的get操作少了getAndIncrement()等自增自减的操作,只支持整个对象的更新。

  • getAndSet()方法取出原来的值并更新新值newValue
  • getAndUpdate()、getAndAccumulate()等操作通过compareAndSet()操作完成原子性的对象更新
    public final V get() {return value;}@SuppressWarnings("unchecked")public final V getAndSet(V newValue) {return (V)unsafe.getAndSetObject(this, valueOffset, newValue);}public final V getAndUpdate(UnaryOperator<V> updateFunction) {V prev, next;do {prev = get();next = updateFunction.apply(prev);} while (!compareAndSet(prev, next));return prev;}public final V getAndAccumulate(V x,BinaryOperator<V> accumulatorFunction) {V prev, next;do {prev = get();next = accumulatorFunction.apply(prev, x);} while (!compareAndSet(prev, next));return prev;}

AtomicReference的set操作

 AtomicReference的set操作是通过unsafe.compareAndSwapObject()方法实现原子性操作,updateAndGet()方法只有在原子性更新成功后才能返回更新后的对象。

public final void set(V newValue) {value = newValue;}public final void lazySet(V newValue) {unsafe.putOrderedObject(this, valueOffset, newValue);}public final boolean compareAndSet(V expect, V update) {return unsafe.compareAndSwapObject(this, valueOffset, expect, update);}public final boolean weakCompareAndSet(V expect, V update) {return unsafe.compareAndSwapObject(this, valueOffset, expect, update);}public final V updateAndGet(UnaryOperator<V> updateFunction) {V prev, next;do {prev = get();next = updateFunction.apply(prev);} while (!compareAndSet(prev, next));return next;}public final V accumulateAndGet(V x,BinaryOperator<V> accumulatorFunction) {V prev, next;do {prev = get();next = accumulatorFunction.apply(prev, x);} while (!compareAndSet(prev, next));return next;}

案例

// AtomicReferenceTest.java的源码
import java.util.concurrent.atomic.AtomicReference;public class AtomicReferenceTest {public static void main(String[] args){// 创建两个Person对象,它们的id分别是101和102。Person p1 = new Person(101);Person p2 = new Person(102);// 新建AtomicReference对象,初始化它的值为p1对象AtomicReference ar = new AtomicReference(p1);// 通过CAS设置ar。如果ar的值为p1的话,则将其设置为p2。ar.compareAndSet(p1, p2);Person p3 = (Person)ar.get();System.out.println("p3 is "+p3);System.out.println("p3.equals(p1)="+p3.equals(p1));}
}class Person {volatile long id;public Person(long id) {this.id = id;}public String toString() {return "id:"+id;}
}运行结果
p3 is id:102
p3.equals(p1)=false

文末彩蛋

高手是持续性自律,你是间歇式自虐

对高手而言自律是一种生活方式若只是间歇性的热血沸腾不可能成功很多工作拼的不是才华而是持续和稳定所以先把你的勤奋变成现在进行时吧!剔除自我感动,也学会自我成全工作、代码、写作、跑步,近乎苦行僧般的生活让我感到很踏实

java源码-AtomicReference相关推荐

  1. Java源码详解六:ConcurrentHashMap源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 数据的存储 构造函数 哈希 put get 扩容 本系列是Java详解,专栏地址:Java源码分析 ConcurrentHashMap 官方文档:ConcurrentH ...

  2. Java源码详解四:String源码分析--openjdk java 11源码

    文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...

  3. Java源码详解五:ArrayList源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 构造函数 add操作 扩容函数 remove函数 subList函数 总结 本系列是Java详解,专栏地址:Java源码分析 ArrayList 官方文档:ArrayL ...

  4. Java源码详解三:Hashtable源码分析--openjdk java 11源码

    文章目录 注释 哈希算法与映射 线程安全的实现方法 put 操作 get操作 本系列是Java详解,专栏地址:Java源码分析 Hashtable官方文档:Hashtable (Java Platfo ...

  5. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  6. Java源码详解零:HashMap介绍

    文章目录 Java详解(0):HashMap介绍,HashMap的迭代,HashMap的线程安全问题 HashMap介绍 HashMap的迭代 HashMap的线程安全问题 Java详解(0):Has ...

  7. Java源码下载和阅读(JDK1.8/Java 11)

    文章目录 1.openjdk的Java源码 2. Oracle 的Java源码 1.openjdk的Java源码 JDK10的源码可以直接从openjdk上下载.下载地址:openjdk-10_src ...

  8. java源码保护技术,sourceguard

    sourceguard 项目记录了本人对java源码保护的一些探索实践. 项目结构 sourceguard-repack 实现原始jar文件的解包,对目标class文件加密和还原成jar文件 sour ...

  9. java源码 - ReentrantReadWriteLock介绍

    开篇  ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWrite ...

最新文章

  1. es java_JAVA API操作ES详解
  2. linux停止python程序_python – Linux上的多处理进程终止失败
  3. Java EE应用程序的单片到微服务重构
  4. 信息学奥赛一本通 1006:A+B问题 | OpenJudge NOI 1.3 01
  5. maven构建Spring项目
  6. VS2010+Opencv_2.4.7+win7的配置攻略及错误解决
  7. WCFSVC文件的分离
  8. 研发数据安全解决方案
  9. window 下 win10 jdk8安装与环境变量的配置(超级详细)
  10. EyouCms1.0前台GetShell漏洞复现
  11. #web前端技术使用总结
  12. CNN卷积神经网络误差反传推导
  13. 应届生面试应答需要注意哪些事项及技巧?
  14. like功能以及check功能
  15. 《数据科学入门》(Data Science from Scratch)读书笔记
  16. 关于getSource()简单说明
  17. 骗子预警,大家注意,飞鸟资源网 www.fn121.c*o*m
  18. cad展点插件lisp使用_CAD自动画杆路插件Autolisp该怎么使用?
  19. php微信自定义菜单开发,微信公众平台开发自定义菜单功能开发
  20. java栈实现--链栈

热门文章

  1. 5.23考前友情提醒
  2. canvas图形绘制
  3. WordPress Shortcode(简码)介绍及使用详解
  4. angular之$parse
  5. lucene 分词相关的类
  6. 虚函数virtual
  7. 求救数据库高手~~急急。。。
  8. 无敌命令 就没有杀不死的进程!
  9. 表达式必须是常量表达式
  10. 关于VS2005智能设备中无法找到PInvoke DLL问题