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; } } }