AtomicReference

个人学习笔记,如有错误欢迎指正。。

 

AtomicReference 提供了原子的方式更新对象引用。用于多线程之间。

 

对象的引用赋值本身就是原子的。

如:共享变量Object o ;

 线程A 执行 :o = "x";//原子的线程安全

 线程B 执行 o =  new Integer(12);//原子的线程安全

 

那么为什么要使用 AtomicReference 呢? 

有一种情况,一个对象的生成依赖于原始对象。 

如线程取出原始对象,基于原始对象的数据再去操作,从而生成新的对象,在保存时原始对象已被其它线程改变了,也就是说刚才线程的操作都不正确了,就不应该更新对象的引用。

 

 

AtomicReference 提供了一个方法,能够知道是否原始对象已改变及原子的线程安全的设定新值。

public final boolean compareAndSet(V expect, V update)

该方法提共了原子方式比较设置,如 expect值与原值相等(指内存地址),则update新值,并返回真,否则返回假。

 

 

 

AtomicReferenceFieldUpdater:

JAVA API:

于反射的实用工具,可以对指定类的指定 volatile 字段进行原子更新。该类用于原子数据结构,该结构中同一节点的几个引用字段都独立受原子更新控制。例如,树节点可能声明为

 class Node {
   private volatile Node left, right;

   private static final AtomicReferenceFieldUpdater<node, node=""> leftUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
   private static AtomicReferenceFieldUpdater<node, node=""> rightUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");

   Node getLeft() { return left;  }
   boolean compareAndSetLeft(Node expect, Node update) {
     return leftUpdater.compareAndSet(this, expect, update);
   }
   // ... and so on
 }
 

你可能感兴趣的:(reference)