比较 和 的源代码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;
}
}
}
但是,当我搜索notifyWatches
in 时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 函数?