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

源码

public class AtomicReference<V> implements Serializable {private static final long serialVersionUID = -1848883965231344442L;private static final Unsafe unsafe = Unsafe.getUnsafe();//通过 unsafe 实现原子操作private static final long valueOffset;private volatile V value;//通过 volatile 实现原子操作public AtomicReference(V var1) {this.value = var1;}public AtomicReference() {}//通过 volatile 实现原子操作public final V get() {return this.value;}//不是原子操作-慎用public final void set(V var1) {this.value = var1;}//通过 unsafe 实现原子操作public final void lazySet(V var1) {unsafe.putOrderedObject(this, valueOffset, var1);}//通过 unsafe 实现原子操作/*** var1当前值:拿当前值value和var1值去比较,如果相等返回true并更新值为var2期望值* var2期望值:如果返回true则更新为期望值,如果返回false则不更新值*/public final boolean compareAndSet(V var1, V var2) {return unsafe.compareAndSwapObject(this, valueOffset, var1, var2);}//通过 unsafe 实现原子操作public final boolean weakCompareAndSet(V var1, V var2) {return unsafe.compareAndSwapObject(this, valueOffset, var1, var2);}//通过 unsafe 实现原子操作public final V getAndSet(V var1) {return unsafe.getAndSetObject(this, valueOffset, var1);}//.....省略.....
}

使用

实体类

class People {private String name;private int age;public People(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "People{" +"name='" + name + '\'' +", age=" + age +'}';}
}
    private static People p1 = new People("Tom", 12);private static People p2 = new People("Jack", 13);private static AtomicReference<People> ar = new AtomicReference(p1);public static void main(String[] args) throws InterruptedException {People people = ar.get();System.out.println(people == p1);//trueSystem.out.println(ar.compareAndSet(null, p2));//falseSystem.out.println(ar.get());//People{name='Tom', age=12}System.out.println(ar.compareAndSet(p1, p2));//trueSystem.out.println(ar.get());//People{name='Jack', age=13}}

AtomicReference和AtomicInteger一样,有ABA问题,用AtomicStampedReference解决

public class Test {private static People p1 = new People("Tom", 12);private static People p2 = new People("Jack", 13);private static AtomicReference<People> at = new AtomicReference(p1);private static AtomicStampedReference<People> asr = new AtomicStampedReference(p1, 0);public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(1);at.compareAndSet(p1, p2);at.compareAndSet(p2, p1);} catch (InterruptedException e) {e.printStackTrace();}});t1.start();Thread t2 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(2);boolean b = at.compareAndSet(p1, p2);System.out.println("AtomicReference " + b);//AtomicReference true} catch (InterruptedException e) {e.printStackTrace();}});t2.start();Thread t3 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(1);asr.compareAndSet(p1, p2, asr.getStamp(), asr.getStamp() + 1);asr.compareAndSet(p2, p1, asr.getStamp(), asr.getStamp() + 1);} catch (InterruptedException e) {e.printStackTrace();}});t3.start();Thread t4 = new Thread(() -> {try {int stamp = asr.getStamp();TimeUnit.SECONDS.sleep(2);boolean b = asr.compareAndSet(p1, p2, stamp, stamp + 1);System.out.println("AtomicStampedReference " + b);//AtomicStampedReference false} catch (InterruptedException e) {e.printStackTrace();}});t4.start();}}

AtomicReference相关推荐

  1. 为什么要有 AtomicReference ?

    我们之前了解过了 AtomicInteger.AtomicLong.AtomicBoolean 等原子性工具类,下面我们继续了解一下位于 java.util.concurrent.atomic 包下的 ...

  2. java 原子引用_Java 原子性引用 AtomicReference

    更多 Java 并发编程方面的文章,请参见文集<Java 并发编程> AtomicReference An object reference that may be updated ato ...

  3. Java进阶:AtomicReference详解

    前言 Atomic家族主要是保证多线程环境下的原子性,相比synchronized而言更加轻量级.比较常用的是AtomicInteger,作用是对Integer类型操作的封装,而AtomicRefer ...

  4. java多线程--AtomicReference

    AtomicReference介绍 AtomicReference是作用是对"对象"进行原子操作. AtomicReference源码分析(基于JDK1.7.0_40) 在JDK1 ...

  5. java intbyreference_java并发包(1)-AtomicReference和AtomicStampedReference

    AtomicReference原子应用类,可以保证你在修改对象引用时的线程安全性,比较时可以按照偏移量进行 这里的cas操作本身是原子的,但是在某些场景下会出现异常场景 线程判断被修改对象是否可以正确 ...

  6. java原子引用怎么理解_Java 原子性引用 AtomicReference

    AtomicReference An object reference that may be updated atomically. The AtomicReference class provid ...

  7. AtomicReference 原子引用

    原创 2016年03月04日 13:35:20 7638 1.简介 赋值操作不是线程安全的.若想不用锁来实现,可以用AtomicReference<V>这个类,实现对象引用的原子更新. 使 ...

  8. java 原子量Atomic举例(AtomicReference)

    Java并发库提供了很多原子类来支持并发访问的数据安全性,除了常用的 AtomicInteger.AtomicBoolean.AtomicLong 外还有 AtomicReference 用以支持对象 ...

  9. java并发AtomicReference

    java并发AtomicReference AtomicReference的作用 已经介绍过AtomicInteger,AtomicIntegerArray,AtomicReference是针对对象的 ...

最新文章

  1. kvm虚拟服务器备份,OpenStack KVM虚拟机实例磁盘的备份脚本
  2. GitHub https链接中输入账户和密码
  3. 5个步骤,绘制高质量的业务流程图
  4. 关闭oracle自动统计,禁用Oracle 11g的统计数据自动收集功能
  5. React引入,运行
  6. 深入了解EntityFramework——数据注解属性
  7. 全连接神经网络_二十九.全连接神经网络原理
  8. 终止一切网上销售和广告?电子烟悦刻天猫旗舰店却仍可购买
  9. 非法关机 mysql_转 mysql数据库非法关机铁血教训
  10. 数组练习:各种数组方法的使用
  11. 分享最新十个流行的 jQuery 插件
  12. 纯php程序无数据,无数据库的详细域名查询程序PHP版(1)_php基础
  13. oracle性能优化 pdf,Oracle性能优化技术内幕 pdg-pdf
  14. GIS应用实例--模型预测、多元回归、空间自相关分析
  15. 星舆科技北斗高精度定位网启动北斗三号服务
  16. 通达信 移动平均算法_高德网络定位算法的演进
  17. oracle取得组内行号,行号
  18. 基于树莓派实现简易-智能家居
  19. 第二章:minio单机版,使用客户端备份文件
  20. Linu修改系统时间

热门文章

  1. 用JS实现简单的省市联动
  2. HTML+CSS制作七夕跳动的红心动画效果
  3. python qt5 数据改变 触发信号_pyqt5自定义信号实例解析
  4. 字节面试:如何用Redis实现一个分布式锁?
  5. 人到了中年在职场中就应该保持内敛的心态
  6. 我很生气,帮了不足一个月就离开了
  7. 装修要找大品牌还是游击队,还是包工头?
  8. 144Hz和60Hz显示器差别很大吗?
  9. 为什么有些WIFI不能用万能钥匙搜索到?怎么才能破解邻居家的WIFI密码?
  10. 开发者友好性和易用性