参照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 + " 已经释放了写锁");
}
}

浙公网安备 33010602011771号