? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? 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。运行结果显示了性能提升明显。
