原子引用应用于需要对引用执行简单atomic(即thread-safe,非平凡)操作的设置,而基于监视器的同步不适用于该设置.假设只在对象的状态保持上次判断时,才判断特定字段:
AtomicReference<Object> cache = new AtomicReference<Object>();
Object cachedValue = new Object();
cache.set(cachedValue);
//... time passes ...
Object cachedValueToUpdate = cache.get();
//... do some work to transform cachedValueToUpdate into a new version
Object newValue = someFunctionOfOld(cachedValueToUpdate);
boolean success = cache.compareAndSet(cachedValue,cachedValueToUpdate);
由于原子引用语义,即使cache
对象在线程之间共享,您也可以做到这一点,而无需使用synchronized
.通常,除非您知道自己在做什么,否则最好使用同步器或java.util.concurrent
框架,而不是赤裸裸的Atomic*
.
将向您介绍此主题的两个优秀的死树参考资料:
请注意(我不知道这是否一直都是正确的)reference赋值(即=
)本身是原子的(更新primitive个64位类型,如long
或double
可能不是原子的;但是更新reference总是原子的,即使它是64位的),而不显式使用Atomic*
.
请看Java Language Specification 3ed, Section 17.7.