public void CompareExistingValueAndSetNewValue()
        {
            AtomicArray <T> ai = new AtomicArray <T>(DEFAULT_COLLECTION_SIZE);

            for (int i = 0; i < DEFAULT_COLLECTION_SIZE; ++i)
            {
                ai.Exchange(i, one);
                Assert.IsTrue(ai.CompareAndSet(i, one, two));
                Assert.IsTrue(ai.CompareAndSet(i, two, m4));
                Assert.AreEqual(m4, ai[i]);
                Assert.IsFalse(ai.CompareAndSet(i, m5, seven));
                Assert.IsFalse((seven.Equals(ai[i])));
                Assert.IsTrue(ai.CompareAndSet(i, m4, seven));
                Assert.AreEqual(seven, ai[i]);
            }
        }
        public void CompareAndSetInMultipleThreads()
        {
            AtomicArray <T> a = new AtomicArray <T>(1);

            a.Exchange(0, one);
            Thread t = new Thread(delegate()
            {
                while (!a.CompareAndSet(0, two, three))
                {
                    Thread.Sleep(Delays.Short);
                }
            });

            t.Start();
            Assert.IsTrue(a.CompareAndSet(0, one, two));
            t.Join(Delays.Long);
            Assert.IsFalse(t.IsAlive);
            Assert.AreEqual(a[0], three);
        }