public void Safe_ConcurrentDictionary_GetOrAdd_CallsValueFactoryOnlyOnce()
        {
            var dictionary = new ConcurrentDictionary<string, Lazy<string>>();
            string thread1Message = null, thread2Message = null;

            var thread1 = new Thread(() => 
                dictionary.GetOrAddSafe("key", _ =>
                {
                    Thread.SpinWait(10000);
                    thread1Message = "thread 1";
                    return thread1Message;
                }));

            var thread2 = new Thread(() => 
                dictionary.GetOrAddSafe("key", _ =>
                {
                    Thread.SpinWait(10000);
                    thread2Message = "thread 2";
                    return thread2Message;
                }));

            thread1.Start();
            thread2.Start();
            thread1.Join();
            thread2.Join();

            bool thread1AndNotThread2 = thread1Message == "thread 1" && thread2Message == null;
            bool thread2AndNotThread1 = thread2Message == "thread 2" && thread1Message == null;

            Assert.IsTrue(thread1AndNotThread2 || thread2AndNotThread1);
        }
        public async Task GetOrAddSafe_OnConcurrentAccess_ReturnsSameInstance()
        {
            const string key = "key";
            var dictionary = new ConcurrentDictionary<string, Lazy<object>>();

            var valueFactory = new Func<string, object>(k =>
            {
                Thread.Sleep(100);
                return new { };
            });

            var r1 = await Task.Run(() => dictionary.GetOrAddSafe(key, valueFactory));
            var r2 = await Task.Run(() => dictionary.GetOrAddSafe(key, valueFactory));
            Thread.Sleep(10);
            var r3 = await Task.Run(() => dictionary.GetOrAddSafe(key, valueFactory));

            Assert.True(r1 == r2 && r2 == r3);
        }