【面向面试学习】AtomicReference和AtomicReferenceFieldUpdater有何区别?

1,786 阅读1分钟

用法

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操作属性的方式是通过反射,按属性名操作

参考

Java原子属性更新器AtomicReferenceFieldUpdater的用法