public bool TryAdd(TKey key, object obj) { // prefer reader //var incr = Interlocked.Increment(ref _locker); //if (incr != 1L) { var sw = new SpinWait(); while (true) { var existing = Interlocked.CompareExchange(ref _locker, 1, 0); if (existing == 0) { break; } sw.SpinOnce(); //if (sw.NextSpinWillYield) //{ // sw.Reset(); //} } } var h = GCHandle.Alloc(obj, GCHandleType.Weak); var added = _inner.TryAdd(key, h); if (!added) { h.Free(); } Volatile.Write(ref _locker, 0L); return(added); }