参照msdn
根据自己的理解,写了两个小实验
1、读线程不必等待(另一个)读线程释放读锁后才被授予读锁 
 class Program 
 { 
private static ReaderWriterLock m_readerWriterLock = new ReaderWriterLock(); 
 private static int m_int = 0; 
 static void Main(string[] args) 
 { 
 Thread readThread = new Thread(new ThreadStart(Read)); 
 readThread.Name = "ReadThread1"; 
 Thread readThread2 = new Thread(new ThreadStart(Read)); 
 readThread2.Name = "ReadThread2"; 
 Thread writeThread = new Thread(new ThreadStart(Writer)); 
 writeThread.Name = "WriterThread"; 
 readThread.Start(); 
 readThread2.Start(); 
 readThread.Join(); 
 readThread2.Join(); 
 Console.ReadLine(); 

 private static void Read() 
 { 
 while(true) 
 { 
 Console.WriteLine("读线程"+Thread.CurrentThread.Name+"开始了..."); 
 m_readerWriterLock.AcquireReaderLock(10000); 
 Console.WriteLine("ThreadName " + Thread.CurrentThread.Name + " 已经获取了读锁"); 
 Console.WriteLine(String.Format("ThreadName : {0} m_int : {1}", Thread.CurrentThread.Name, m_int)); 
 Thread.Sleep(30000); 
 m_readerWriterLock.ReleaseReaderLock(); 
 Console.WriteLine("ThreadName " + Thread.CurrentThread.Name + " 已经施放了读锁"); 
 } 
 } 

2、读/写线程必须等写/读线程释放掉写/读锁之后才可以获取读/写锁 
class Program 
 { 
private static ReaderWriterLock m_readerWriterLock = new ReaderWriterLock(); 
 private static int m_int = 0; 
 static void Main(string[] args) 
 { 
 Thread readThread = new Thread(new ThreadStart(Read)); 
 readThread.Name = "ReadThread1"; 
 Thread readThread2 = new Thread(new ThreadStart(Read)); 
 readThread2.Name = "ReadThread2"; 
 Thread writeThread = new Thread(new ThreadStart(Writer)); 
 writeThread.Name = "WriterThread"; 
  readThread.Start(); 
 readThread2.Start(); 
 writeThread.Start(); 
 readThread.Join(); 
 readThread2.Join(); 
 writeThread.Join(); 
 Console.ReadLine(); 
 } 
 private static void Read() 
 { 
 while(true) 
 { 
 Console.WriteLine("读线程"+Thread.CurrentThread.Name+"开始了..."); 
 m_readerWriterLock.AcquireReaderLock(10000); 
 Console.WriteLine("ThreadName " + Thread.CurrentThread.Name + " 已经获取了读锁"); 
 Console.WriteLine(String.Format("ThreadName : {0} m_int : {1}", Thread.CurrentThread.Name, m_int)); 
 m_readerWriterLock.ReleaseReaderLock(); 
 Console.WriteLine("ThreadName " + Thread.CurrentThread.Name + " 已经施放了读锁"); 
 } 
 } 
 
 private static void Writer() 
 { 
 while(true) 
 { 
 Console.WriteLine("写线程开始了..."); 
 m_readerWriterLock.AcquireWriterLock(1000); 
 Console.WriteLine("ThreadName " + Thread.CurrentThread.Name + " 已经获取了写锁"); 
 Interlocked.Increment(ref m_int); 
 Thread.Sleep(5000); 
 m_readerWriterLock.ReleaseWriterLock(); 
 Console.WriteLine("ThreadName " + Thread.CurrentThread.Name + " 已经释放了写锁"); 
 } 
 } 

posted on 2010-10-13 14:54  Jessica Lu  阅读(317)  评论(0)    收藏  举报