在StatsProviderProxy里,有一个对象如下:
private final AtomicReference<StatsProvider> instance = new AtomicReference<>(new NullStatsProvider());
这里的AtomicReference是包java.util.concurrent.atomic的类,原子引用类。所谓原子引用类,就是,它保存一个对象的引用,提供原子操作函数更新这个引用。比如说,一开始,这个引用是p1,其他对象使用AtomicReference操作p1,过了一段时间,需要把这个引用更新为另一个对象p2,此时就存在一个可能:在用p2更新引用值得时候,其他对象仍然使用了p1,导致出错,因此,需要把这个更新动作以原子操作的方式实现。
在AtomicReference的源码里,用CAS函数实现,也就是CompareAndSet函数:
public final boolean compareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}
unsafe的compareAndSwapObject是JNI调用C++代码,C++代码调用cpu的特殊指令实现硬件上的CAS。
unsafe是sun.misc.unsafe类,这个类非常特殊,提供各种魔法操作,因此是不安全的。
unsafe-->CAS-->AQS-->java.util.concurrent包是一个顺序关系。
更多介绍可以看这里:
https://www.cnblogs.com/suxuan/p/4948608.html
https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
https://www.jianshu.com/p/54cc20a87502
java并发编程可以参考这里:
https://www.jianshu.com/nb/13250240