とのソースコードを比較すると、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
て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のすべてのウォッチ関数はどのように通知されますか?