using System; using System.Collections.Generic; namespace Newtonsoft.Json.Utilities { internal class ThreadSafeStore { private readonly object _lock = new object(); private Dictionary _store; private readonly Func _creator; public ThreadSafeStore(Func creator) { if (creator == null) throw new ArgumentNullException("creator"); _creator = creator; } public TValue Get(TKey key) { if (_store == null) return AddValue(key); TValue value; if (!_store.TryGetValue(key, out value)) return AddValue(key); return value; } private TValue AddValue(TKey key) { TValue value = _creator(key); lock (_lock) { if (_store == null) { _store = new Dictionary(); _store[key] = value; } else { // double check locking TValue checkValue; if (_store.TryGetValue(key, out checkValue)) return checkValue; Dictionary newStore = new Dictionary(_store); newStore[key] = value; _store = newStore; } return value; } } } }