.Net还提供了几个手工同步的类,可以使用它们来创建自己的同步机制,手工同步一般用于一下情况:对多线程共享变量的同步访问,线程间或跨进程的同步,实现单个写、多个读的同步。
下面介绍ReadWriterLock类。该类提供单个进程写和多个进程读的控制机制,其优点是资源开销非常低。该类有两个锁,读线程锁与写线程锁。当请求写线程后,在写线程取得访问权之前,不会接受任何新的新的读线程,从而实现多个线程在任何时刻执行读方法,或只允许单个线程在某一时刻执行方法。
运行结果:
源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Contexts;
namespace Test1_1
{
class HelloWorld
{
static void Main(string[] args)
{
Resource r = new Resource();
Thread t1 = new Thread(new ThreadStart(r.Write)); //创建读线程
Thread t2 = new Thread(new ThreadStart(r.Write)); //创建读线程
Thread t3 = new Thread(new ThreadStart(r.Read)); //创建读线程
Thread t4 = new Thread(new ThreadStart(r.Read)); //创建读线程
t1.Name = "写线程1"; //创建线程名
t2.Name = "写线程2";
t3.Name = "读线程1";
t4.Name = "读线程2";
t1.Start();
t3.Start();
t2.Start();
t4.Start();
Console.Read();
}
}
public class Resource
{
ReaderWriterLock rwl = new ReaderWriterLock();
private int count = 0;
public void Read()
{
rwl.AcquireReaderLock(Timeout.Infinite);
try
{
Console.WriteLine("+{0}进入读方法 count = {1}", Thread.CurrentThread.Name, count);
Thread.Sleep(500);
}
finally
{
rwl.ReleaseReaderLock();
Console.WriteLine("-{0}离开读方法", Thread.CurrentThread.Name);
}
}
public void Write()
{
rwl.AcquireWriterLock(Timeout.Infinite);
try
{
++count;
Console.WriteLine("+{0}进入写方法 count = {1}", Thread.CurrentThread.Name, count);
Thread.Sleep(500);
}
finally
{
rwl.ReleaseWriterLock();
Console.WriteLine("-{0}离开写方法", Thread.CurrentThread.Name);
}
}
}
}
该实例允许多个线程在任何时刻执行read方法,但只允许在某一个时刻只有一个线程执行Write()方法。写线程1执行Write方法时,其他写线程不能执行Write()方法,如写线程2,直到写线程1离开Write方法,释放了写锁后,才能执行Write方法。而读线程1和读线程2对Read方法可同时进行。