用法
AtomicReference
String title="掘金";
AtomicReference atomicReference = new AtomicReference(title);
String reference = (String) atomicReference.get();
AtomicReferenceFieldUpdater
class Dog {
volatile String name="dog1";
}
AtomicReferenceFieldUpdater updater=AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class,"name");
Dog aDog=new Dog();
println(updater.compareAndSet(aDog,"dog1","dog2"));
println(aDog.name);
println(updater.getAndSet(aDog, "dog3"));
println(aDog.name);
//输出
true
dog2
dog2
dog3
区别
两者都是利用UnSafe提供的CAS机制实现在多线程场景下安全的、原子的数据更新操作,区别主要有
- AtomicReference是针对一个引用的增删改查做到线程安全
- AtomicReferenceFieldUpdater是针对一个对象的一个属性的增删改查做到线程安全
- AtomicReferenceFieldUpdater操作属性的方式是通过反射,按属性名操作