重新学C#编程163-Monitor:锁定资源

在 C# 中 Monitor 类的命名空间是 System.Threading,它的用法要比 lock 的用法复杂一些,但本质是一样的。

使用 Monitor 类锁定资源的代码如下。

Monitor.Enter(object);
try
{
    //临界区代码
}
finally
{
    Monitor.Exit(object);
}

在这里,object 值与 lock 中的 object 值是一样的。

简而言之,lock 的写法是 Monitor 类的一种简写。

做一个练习,将上一篇中lock类替换成monitor类,实现同样的功能。

完整的代码如下:

using System;
using System.Threading;
namespace Monitor类练习
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Monitor练习");
      Program program = new Program();
      ThreadStart threadStart1 = new ThreadStart(program.showEven);
      Thread thread1 = new Thread(threadStart1);
      thread1.Name = "显示偶数的线程:";
      thread1.Start();

      ThreadStart threadStart2 = new ThreadStart(program.showOdd);
      Thread thread2 = new Thread(threadStart2);
      thread2.Name = "显示奇数的线程:";
      thread2.Start();
    }
    public void showEven()
    {
      Monitor.Enter(this);
      try
      {
        for(int i=2;i<=100;i+=2)
        {
          Console.WriteLine(Thread.CurrentThread.Name + i );
        }
      }
      finally
      {
        Monitor.Exit(this);
      }
    }
    public void showOdd()
    {
      Monitor.Enter(this);
      try
      {
        for(int i=1;i<=100;i+=2)
        {
          Console.WriteLine(Thread.CurrentThread.Name + i);
        }
      }
      finally
      {
        Monitor.Exit(this);
      }
    }
  }
}

Monitor 类的用法虽然比 lock 关键字复杂,但其能添加等待获得锁定的超时值,这样就不会无限期等待获得对象锁。

使用 TryEnter() 方法可以给它传送一个超时值,决定等待获得对象锁的最长时间。

使用 TryEnter() 方法设置获得对象锁的时间的代码如下。

Monitor.TryEnter(object, 毫秒数 );

该方法能在指定的毫秒数内结束线程,这样能避免线程之间的死锁现象。

此外,还能使用 Monitor 类中的 Wait() 方法让线程等待一定的时间,使用 Pulse() 方法通知处于等待状态的线程。

posted @ 2021-07-05 14:38  来自金沙江的小鱼  阅读(70)  评论(0编辑  收藏  举报