C#开发之——Monitor(14.7)

本文详细介绍了C#中Monitor类的使用方法,包括其与lock关键字的区别与联系,Monitor类的Enter、Exit、TryEnter及Wait等方法的使用场景与注意事项,通过实例展示了如何使用Monitor类实现线程同步。

一 概述

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

<!--more-->

二 语法形式

<span style="color:#333333">Monitor.Enter(object);
try
{
    //临界区代码
}
finally
{
    Monitor.Exit(object);
}</span>
  • 在这里,object的值与lock的值是一样的

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

三 实例  将上一节C# lock实例中的 lock 关键字替换成 Monitor 类 

3.1 代码

<span style="color:#333333">class Program
{
    public void PrintEven()
    {
        Monitor.Enter(this);
        try
        {
            for(int i = 0; i <= 10; i = i + 2)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "--" + i);
            }
        }
        finally
        {
            Monitor.Exit(this);
        }
    }
    public void PrintOdd()
    {
        Monitor.Enter(this);
        try
        {
            for(int i = 1; i <= 10; i = i + 2)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "--" + i);
            }
        }
        finally
        {
            Monitor.Exit(this);
        }
    }
    static void Main(string[] args)
    {
        Program program = new Program();
        ThreadStart ts1 = new ThreadStart(program.PrintOdd);
        Thread t1 = new Thread(ts1);
        t1.Name = "打印奇数的线程";
        t1.Start();
        ThreadStart ts2 = new ThreadStart(program.PrintEven);
        Thread t2 = new Thread(ts2);
        t2.Name = "打印偶数的线程";
        t2.Start();
    }
}</span>

3.2 效果

 

3.3 说明

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

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

  • 使用TryEnter()方法设置获得对象锁的时间的代码如下, 该方法能在指定的毫秒数内结束线程,这样能避免线程之间的死锁现象

    Monitor.TryEnter(object, 毫秒数 );
  • 此外,还能使用 Monitor 类中的 Wait() 方法让线程等待一定的时间,使用 Pulse() 方法通知处于等待状态的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值