public async Task Can_exchange_value()
        {
            var safeLazy = new ThreadSafeLazyRef <string>(() => "");
            var tasks    = new List <Task>();

            for (var i = 0; i < 10; i++)
            {
                tasks.Add(Task.Run(() => safeLazy.ExchangeValue(s => s + "s")));
            }

            await Task.WhenAll(tasks);

            Assert.Equal("ssssssssss", safeLazy.Value);
        }
        public virtual TValue GetOrAdd([NotNull] TKey key, [NotNull] Func <TKey, TValue> factory)
        {
            Check.NotNull(key, "key");
            Check.NotNull(factory, "factory");

            TValue value;

            if (!_cache.Value.TryGetValue(key, out value))
            {
                var newValue = factory(key);
                _cache.ExchangeValue(d => d.ContainsKey(key) ? d : d.Add(key, newValue));
                value = _cache.Value[key];
            }
            return(value);
        }