Monitor 类的命名空间是 System.Threading,它的用法和 lock 本质是一样的。

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

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


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

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

  public void PrintOdd1()
  {
    try
    {
      Monitor.Enter(obj);
      for (int i = 1; i <= 100; i += 2)
      {
        WriteLine(i);
      }

    }
    catch (Exception)
    {

      throw;
    }
    finally

     {
      Monitor.Exit(obj);
    }
  }

  public void PrintEven1()
  {
    try
    {
      Monitor.Enter(obj);
      for (int i = 2; i <= 100; i += 2)
      {
        WriteLine(i);
      }
    }
    catch (Exception)
    {

      throw;
    }
    finally
    {
      Monitor.Exit(obj);
    }
  }

  Program program = new Program();
  Thread t1 = new Thread(program.PrintOdd1);
  t1.Start();
  Thread t2 = new Thread(program.PrintEven1);
  t2.Start();

  另一个购票的例子:

  private object obj = new object();
  private static int ticketsNum = 100;

  public void BuyTickets1()
  {
    try
    {
      Monitor.Enter(obj);
      if (ticketsNum > 0)
      {
        ticketsNum -= 1;
        WriteLine("Thread1, 购1,剩" + ticketsNum);
      }
      else
      {
        WriteLine("Thread1, 没票了");
      }
    }
    catch (Exception)
    {
      throw;
    }
    finally
    {
      Monitor.Exit(obj);
    }
  }

  public void BuyTickets2()
  {
    try
    {
      Monitor.Enter(obj);
      if (ticketsNum > 0)
      {
        ticketsNum -= 1;
        WriteLine("Thread2, 购1,剩" + ticketsNum);
      }
      else
      {
        WriteLine("Thread2, 没票了");
      }
    }
    catch (Exception)
    {
      throw;
    }
    finally
    {
      Monitor.Exit(obj);
    }
  }

  static void Main(...)

  { 

    while (ticketsNum > 0)
    {
      Program program = new Program();
      Thread t1 = new Thread(program.BuyTickets1);
      t1.Start();
      Thread t2 = new Thread(program.BuyTickets2);
      t2.Start();
    }

  }

  以上模拟两个人购票,一个人购票时限制另一个人购票,同步更新剩余的票数。

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

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

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

  Monitor.TryEnter(object, 毫秒数 );


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

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

  

  http://c.biancheng.net/view/3000.html

线程二(Monitor)的更多相关文章

  1. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  2. 【Qt开发】事件循环与线程 二

    事件循环与线程 二 Qt 线程类 Qt对线程的支持已经有很多年了(发布于2000年九月22日的Qt2.2引入了QThread类),Qt 4.0版本的release则对其所有所支持平台默认地是对多线程支 ...

  3. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  4. Java线程(二):线程同步synchronized和volatile

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...

  5. C#中的线程二(BeginInvoke和Invoke)

    近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下.感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 . (一)Control的In ...

  6. java 线程二

    一.线程的优先级别 线程优先级别的使用范例: 1 package cn.galc.test; 2 3 public class TestThread6 { 4 public static void m ...

  7. java基础学习总结——线程(二)

    一.线程的优先级别

  8. java基础—线程(二)

    一.线程的优先级别

  9. 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

随机推荐

  1. Centos7 卸载 Nginx 并重新安装 Nginx

    1)  卸载nginx [root@locahost /]# yum remove nginx 2) 查看nginx是否还存在 [root@localhost /]# which nginx 3)重新 ...

  2. 重装Mac系统

    首先介绍重装macos的一些重要事项: 重装系统之前需要弄清楚本机上安装的系统版本. 重装系统是需要管理员账户的. 获取系统镜像有多种方式,其中最常见的方式是从appstore中获取,但要注意的是要确 ...

  3. 004-行为型-01-策略模式(Strategy)

    一.概述 定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可 ...

  4. 安卓 android studio 报错 All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com

    这个问题是Android studio升级到3.0之后,运行的时候会提示gradle要升级到3.5版本才能编译.于是我把我的gradle升级到了 gradle-4.1-milestone-1 版本,是 ...

  5. Linux记录-史上最全的MySQL高性能优化实战总结(转载)

       史上最全的MySQL高性能优化实战总结! 1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优 ...

  6. 最新CSS兼容方案

    CSS兼容方案,让你的样式完美兼容各大浏览器,这个方案主要是用来解决Safari的,Opear是在测试的时候顺带试了一下,结果发现竟然也行,所以顺便也解决了. .e {/*FF OP*/ color: ...

  7. 汉字转拼音插件:LM-PinYin.js

    CDN:http://dtdxrk.github.io/jsPlug/pinyin/LM-PinYin.js demo演示地址:http://dtdxrk.github.io/jsPlug/pinyi ...

  8. 软件素材---linux C语言:向文件末尾进行追加数据

    void AppendDataToFile(char* filePath, char* msg) { // 以附加方式打开可读/写的文件, 如果没有此文件则会进行创建,然后以附加方式打开可读/写的文件 ...

  9. PHP-FPM配置与调优

    PHP-FPM是啥? PHP-FPM是一个PHP FastCGI的管理器,它实际上就是PHP源代码的补丁,旨在将FastCGI进程管理引进到PHP软件包中. CGI是啥? CGI全称"公共网 ...

  10. Copy-On-Write技术

    通俗的解释,假定多方需要使用同一个资源时,没有必要为每一方都创建该资源的一个完整的副本,反而令多方共享这个资源,当某方需要修改资源的某处时,利用引用计数,把该处复制一个副本,再把跟新的内容写入该副本中 ...