public void ReaderWriterLockTest() { const int iterations = 10000; var resource = new List <int> { 1 }; var locker = new ReadWriteLock(); var concurrentWriterCounter = 0; var startSignal = new ManualResetEvent(false); int Read() { var random = new Random(); var count = 0; startSignal.WaitOne(); for (var i = 0; i < iterations; i++) { using (locker.AcquireRead()) count += resource[random.Next(0, resource.Count)]; Thread.Sleep(0); } return(count); } int Write() { var random = new Random(); var count = 0; startSignal.WaitOne(); for (var i = 0; i < iterations; i++) { using (locker.AcquireRead()) { if (Interlocked.Increment(ref concurrentWriterCounter) != 1) { Assert.IsTrue(false, "Many writer at the same time"); } resource.Add(random.Next(0, 100)); if (Interlocked.Decrement(ref concurrentWriterCounter) != 0) { Assert.IsTrue(false, "Many writer at the same time"); } } Thread.Sleep(0); } return(count); } var readThreads = Enumerable.Range(0, 10).Select(p => Task.Run(Read)); var writeThreads = Enumerable.Range(0, 3).Select(p => Task.Run(Write)); Thread.Sleep(10); startSignal.Set(); foreach (var task in readThreads.Concat(writeThreads)) { task.Wait(); } }