比较 和 的源代码clojure.lang.Ref,clojure.lang.Atom我发现它们都继承自clojure.lang.ARef.
其中clojure.lang.ARef有一个功能notifyWatches可以让所有手表功能都知道已经进行了更改。
swap!和reset!函数在其实现中的clojure.lang.Atom调用。notifyWatches
例如。
public Object swap(IFn f) {
for(; ;)
{
Object v = deref();
Object newv = f.invoke(v);
validate(newv);
if(state.compareAndSet(v, newv))
{
notifyWatches(v, newv);
return newv;
}
}
}
但是,当我搜索notifyWatchesin 时clojure.lang.Ref,它什么也没有。alter函数看起来像这样。
public Object alter(IFn fn, ISeq args) {
LockingTransaction t = LockingTransaction.getEx();
return t.doSet(this, fn.applyTo(RT.cons(t.doGet(this), args)));
}
如果没有方法调用 notifyWatches,如何通知 ref 的所有 watch 函数?