ThreadSafeStore<TKey, TValue>
using System;
using System.Collections.Generic;
using System.Threading;
namespace Newtonsoft.Json.Utilities
{
    internal class ThreadSafeStore<TKey, TValue>
    {
        private readonly object _lock = new object();
        private Dictionary<TKey, TValue> _store;
        private readonly Func<TKey, TValue> _creator;
        public ThreadSafeStore(Func<TKey, TValue> creator)
        {
            ValidationUtils.ArgumentNotNull(creator, "creator");
            _creator = creator;
            _store = new Dictionary<TKey, TValue>();
        }
        public TValue Get(TKey key)
        {
            if (!_store.TryGetValue(key, out TValue value))
                return AddValue(key);
            return value;
        }
        private TValue AddValue(TKey key)
        {
            TValue val = _creator(key);
            lock (_lock) {
                if (_store == null) {
                    _store = new Dictionary<TKey, TValue>();
                    _store[key] = val;
                } else {
                    if (_store.TryGetValue(key, out TValue value))
                        return value;
                    Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(_store);
                    dictionary[key] = val;
                    Thread.MemoryBarrier();
                    _store = dictionary;
                }
                return val;
            }
        }
    }
}