(t); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? var t = Task.Factory.StartNew(WriteSomething); ? ? ? ? ? ? ? ? ? ? lstTask.Add(t); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? Task.WaitAll(lstTask.ToArray()); ? ? ? ? ? ? sw.Stop(); ? ? ? ? ? ? Console.WriteLine("使用ReaderWriterLockSlim方式,耗时:" + sw.Elapsed); ? ? ? ? ? ? sw.Restart(); ? ? ? ? ? ? lstTask = new List(); ? ? ? ? ? ? for (int i = 0; i < 500; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (i % 25 != 0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? var t = Task.Factory.StartNew(ReadSomething_lock); ? ? ? ? ? ? ? ? ? ? lstTask.Add(t); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? var t = Task.Factory.StartNew(WriteSomething_lock); ? ? ? ? ? ? ? ? ? ? lstTask.Add(t); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? Task.WaitAll(lstTask.ToArray()); ? ? ? ? ? ? sw.Stop(); ? ? ? ? ? ? Console.WriteLine("使用lock方式,耗时:" + sw.Elapsed); ? ? ? ? } ? ? ? ? static private object _lock1 = new object(); ? ? ? ? static public void ReadSomething_lock() ? ? ? ? { ? ? ? ? ? ? lock (_lock1) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? ? ? Thread.Sleep(10);//模拟读取信息 ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? static public void WriteSomething_lock() ? ? ? ? { ? ? ? ? ? ? lock (_lock1) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? ? ? Thread.Sleep(100);//模拟写入信息 ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? static public void ReadSomething() ? ? ? ? { ? ? ? ? ? ? rwl.EnterReadLock(); ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? ? ? Thread.Sleep(10);//模拟读取信息 ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} reading end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? } ? ? ? ? ? ? finally ? ? ? ? ? ? { ? ? ? ? ? ? ? ? rwl.ExitReadLock(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? static public void WriteSomething() ? ? ? ? { ? ? ? ? ? ? rwl.EnterWriteLock(); ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? ? ? Thread.Sleep(100);//模拟写入信息 ? ? ? ? ? ? ? ? //Console.WriteLine("{0} Thread ID {1} writing end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode()); ? ? ? ? ? ? } ? ? ? ? ? ? finally ? ? ? ? ? ? { ? ? ? ? ? ? ? ? rwl.ExitWriteLock(); ? ? ? ? ? ? } ? ? ? ? } ? ? }
上述代码,就500个Task,每个Task占用一个线程池线程,其中20个写入线程和480个读取线程,模拟操作。其中读取数据花10ms,写入操作花100ms,分别测试了对于lock方式和ReaderWriterLockSlim方式。可以做一个估算,对于ReaderWriterLockSlim,假设480个线程同时读取,那么消耗10ms,20个写入操作占用2000ms,因此所消耗时间2010ms,而对于普通的lock方式,由于都是独占性的,因此480个读取操作占时间4800ms+20个写入操作2000ms=6800ms。运行结果显示了性能提升明显。

|