个人学习笔记,如有错误欢迎指正。。
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 }