首页 > 编程笔记 > C#笔记 阅读:4

C# 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

使用 Monitor 类有很好的控制能力,例如,它可以使用 Wait 方法指示活动的线程等待一段时间,当线程完成操作时,还可以使用 Pulse 方法或 PulseAll 方法通知等待中的线程。

相关文章