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