C# Monitor类实现线程同步(附带实例)
Monitor 类提供了同步对对象的访问机制,它通过向单个线程授予对象锁来控制对对象的访问,对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象锁时,其他任何线程都不能获取该锁。
Monitor 类的主要功能如下:
Monitor 类的常用方法及说明如下表所示:
	
【实例】使用 Monitor 类设置同步块模拟售票系统,主要代码如下:
	
	
Monitor 类的主要功能如下:
- 根据需要与某个对象相关联;
 - 它是未绑定的,也就是说,可以直接从任何上下文调用它;
 - 不能创建 Monitor 类的实例。
 
Monitor 类的常用方法及说明如下表所示:
| 方法 | 说明 | 
|---|---|
| Enter | 在指定对象中获取排他锁 | 
| Exit | 释放指定对象中的排他锁 | 
| Pulse | 通知等待队列中的线程锁定对象状态的更改 | 
| PulseAll | 通知所有的等待线程对象状态的更改 | 
| TryEnter | 试图获取指定对象的排他锁 | 
| Wait | 释放对象中的锁并阻塞当前线程,直到它重新获取该锁 | 
【实例】使用 Monitor 类设置同步块模拟售票系统,主要代码如下:
class Program
{
    int num = 10; //设置当前总票数
    void Ticket()
    {
        while (true)
        {
            Monitor.Enter(this); //锁定代码块 //判断当前票数是否大于0
            if (num > 0)
            {
                Thread.Sleep(100); //使当前线程休眠100毫秒
                //票数减1
                Console.WriteLine(Thread.CurrentThread.Name + "----票数" + num--);
            }
            Monitor.Exit(this); //解锁代码块
        }
    }
    static void Main(string[] args)
    {
        Program p = new Program(); //创建对象,以便调用对象方法
        Thread tA = new Thread(new ThreadStart(p.Ticket)); //分别实例化4个线程,并设置名称
        tA.Name = "线程一";
        Thread tB = new Thread(new ThreadStart(p.Ticket));
        tB.Name = "线程二";
        Thread tC = new Thread(new ThreadStart(p.Ticket));
        tC.Name = "线程三";
        Thread tD = new Thread(new ThreadStart(p.Ticket));
        tD.Name = "线程四";
        tA.Start(); //分别启动线程
        tB.Start();
        tC.Start();
        tD.Start();
        Console.ReadLine();
    }
}
运行结果为:
	线程一----票数10
	线程二----票数9
	线程三----票数8
	线程四----票数7
	线程一----票数6
	线程二----票数5
	线程三----票数4
	线程四----票数3
	线程一----票数2
	线程二----票数1
 ICP备案:
 公安联网备案: