一、AtomicReference介绍和函数列表

AtomicReference是作用是对"对象"进行原子操作。

        AtomicReference函数列表:

// 使用 null 初始值创建新的 AtomicReference。
AtomicReference()
// 使用给定的初始值创建新的 AtomicReference。
AtomicReference(V initialValue)// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean compareAndSet(V expect, V update)
// 获取当前值。
V get()
// 以原子方式设置为给定值,并返回旧值。
V getAndSet(V newValue)
// 最终设置为给定值。
void lazySet(V newValue)
// 设置为给定值。
void set(V newValue)
// 返回当前值的字符串表示形式。
String toString()
// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean weakCompareAndSet(V expect, V update)

二、AtomicReference源码分析(基于JDK1.7.0_40)

在JDK1.7.0_40中AtomicReference.java的源码如下:

public class AtomicReference<V>  implements java.io.Serializable {private static final long serialVersionUID = -1848883965231344442L;// 获取Unsafe对象,Unsafe的作用是提供CAS操作private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static {try {valueOffset = unsafe.objectFieldOffset(AtomicReference.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}// volatile类型private volatile V value;public AtomicReference(V initialValue) {value = initialValue;}public AtomicReference() {}public final V get() {return value;}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 getAndSet(V newValue) {while (true) {V x = get();if (compareAndSet(x, newValue))return x;}}public String toString() {return String.valueOf(get());}
}

        说明
         AtomicReference的源码比较简单。它是通过"volatile"和"Unsafe提供的CAS函数实现"原子操作。
        (1) value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
        (2) 通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。

三、AtomicReference示例

// 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

        结果说明
        新建AtomicReference对象ar时,将它初始化为p1。
        紧接着,通过CAS函数对它进行设置。如果ar的值为p1的话,则将其设置为p2。
        最后,获取ar对应的对象,并打印结果。p3.equals(p1)的结果为false,这是因为Person并没有覆盖equals()方法,而是采用继承自Object.java的equals()方法;而Object.java中的equals()实际上是调用"=="去比较两个对象,即比较两个对象的地址是否相等。

AtomicReference原子类相关推荐

  1. java多线程系类:JUC原子类:04之AtomicReference原子类

    概要 本章对AtomicReference引用类型的原子类进行介绍.内容包括: AtomicReference介绍和函数列表 AtomicReference源码分析(基于JDK1.7.0_40) At ...

  2. java原子变量的作用_AtomicInteger原子类的作用介绍(代码示例)

    本篇文章给大家带来的内容是关于AtomicInteger原子类的作用介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. AtomicInteger 原子类的作用 多线程操 ...

  3. 【Java_多线程并发编程】JUC原子类——4种原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2. 数组类型: Ato ...

  4. Java高并发编程:原子类

    1. 并发编程概念 原子性 一个操作不能被再拆分了:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.一个很经典的例子就是银行账户转账问题. 增量操作符++,不是原 ...

  5. Java多线程系列--“JUC原子类”01之 框架

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--"JUC原子类"01之 框架 根据修改的数据类型,可以将JUC包中的原子操作类可以分 ...

  6. Atomic原子类常用方法总结(包含四大类型)

    基本介绍: Atomic指一个操作不可中断,即使在多线程情况下,一个操作一旦开始,就不会被其他线程干扰.如果多线程中仅需要Atomic原子类解决的事情,就不需要synchronized重量级锁了. 原 ...

  7. 21.3.3 原子性与易变性 21.3.4 原子类

    原子操作是不能被线程集中中断的操作. 原子性可以应用于除long和double之外的素有基本类型,jvm将64位的读取和写入当做两个分离的32位操作来执行,产生一个读取和写入操作中间发生上下文切换,导 ...

  8. Java多线程(二)之Atomic:原子变量与原子类

    一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic是指不能分割成若干部分的意思.如果一段代码被认为是Atomic,则表示这段代码在执行过程中 ...

  9. java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...

    CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题(1)CAS是什么? 比较并交换 举例1,  CAS产生场景代码? importjava.util.concurrent ...

最新文章

  1. SQL注入—我是如何一步步攻破一家互联网公司的
  2. HDFS配置Kerberos
  3. git 撤销对工作区中文件的修改
  4. 编译安装mysql5.5.39_编译安装MySQL5.5
  5. 半夜,滴滴司机问我会LRU吗?
  6. Go 服务进行自动采样性能分析的方案设计与实现
  7. 查看当前内存使用情况---练习记录
  8. 数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
  9. 量化交易11-backtrader回测两只乌鸦、三只乌鸦K线形态图
  10. WordPress有没有好的主题推荐?27个Ultra WordPress企业主题分享:不再有选择 困难症了
  11. 推荐两款github敏感信息搜集工具(gsil、gshark)
  12. CTF题库-实验吧(密码学)之综合篇
  13. 词语提取小工具开放啦
  14. c语言程序设计 大学考试题库,网络教育成考大学C语言程序设计考试题库及答案...
  15. 基于k-means聚类算法对NBA球员数据的一次聚类分析
  16. 6个 Python 办公黑科技,工作效率提升100倍!(附代码)
  17. iOS逆向工程——获取app素材图片
  18. 小学教师计算机个人研修计划,教师信息技术研修计划
  19. 英特尔挖走苹果M1芯片工程师,或将改变x86架构
  20. Websocket安装说明

热门文章

  1. 阿里技术男的成长史:越想证明自己死得越快……
  2. 聊聊进大厂的人简历是怎么写的?以及面试需要注意的点
  3. 2017华为软件精英挑战赛总结
  4. inmp构架搭建Wordpress博客
  5. 安装软件出现Microsoft Visual C++ 2015 Redistributable (x64) 安装失败 win10卸载2017再次进行即可
  6. VS插件_Supercharger_Auto Placeholders自动添加 用户+时间
  7. 视通助力中国航天某院多媒体会议室建设
  8. 还在辛苦一个个投简历?试试用web自动化海投
  9. Sahi - Screen Shots
  10. 计算机前沿国际会议: 图灵测试测试题 ,人工智能得分:0分