一、Monitor类说明,提供同步访问对象的机制。

1.位于System.Threading命名空间下,mscorlib.dll程序集中。

2.Monitor通过获取和释放排它锁的方式实现多线程的同步问题。

3.Monitor实现当前进程内的多线程的同步,和lock语句的功能类似。

4.当前为静态类,使用简单

5.依赖的锁定对象和lock语句中类似,同样需要引用类型、建议私有、只读、静态

定义代码:

    //// 摘要://     提供同步访问对象的机制。[ComVisible(true)]public static class Monitor

二、常用方法说明

1.Enter(obj)方法 在指定对象上获取排它锁。

2.Exit(obj)   释放指定对象上的排他锁。

3.IsEntered(obj) 判断当前线程是否已经持有排它锁

4.TryEnter(object obj, TimeSpan timeout)  在指定的时间量内尝试获取指定对象上的排他锁。

5.Wait(object obj) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

6.Pulse(object obj) 通知等待队列中的线程锁定对象状态的更改。

7.PulseAll(object obj)  通知所有的等待线程对象状态的更改。

三、示例说明一:

说明:多线程累加数值,解决同步问题

private readonly static object _MyLock = new object();
static int Count = 0;
static void CountAdd()
{Monitor.Enter(_MyLock); //获取排它锁Count++;Console.WriteLine(Count);if (Count == 10){Count = 0;}Monitor.Exit(_MyLock); //释放排它锁
}
public static void TestOne()
{//启动4个线程,累加Countfor (int i = 0; i < 4; i++){Task.Factory.StartNew(() =>{while (true){CountAdd();Thread.Sleep(500 * i);}});}
}

1.如果不使用排它锁处理,会出现数据异常

2.使用锁定结果会正常

四、借助于using(){} 块实现锁定处理

1.此场景在事务处理中可能会用到,保证同一个事务,如果一个线程开启操作,其他线程对当前事务操作等待。

2.此场景对于外部使用,不需要考虑多线程问题

1.继承了IDisposable接口的封装

    class AddHelper : IDisposable{private readonly static object _MyLock = new object();static int Count = 0;public AddHelper(){//启用排它锁
            Monitor.Enter(_MyLock);}public void AddCount(){Count++;Console.WriteLine(Count);if (Count == 10){Count = 0;}}public void Dispose(){//释放排它锁
            Monitor.Exit(_MyLock);}}

2.调用代码块

public static void TestTwo()
{//启动4个线程,累加Countfor (int i = 0; i < 4; i++){Task.Factory.StartNew(() =>{while (true){//如果不使用排他锁处理,会出现数据异常//AddHelper _add = new AddHelper();//_add.AddCount();//将排他锁处理封装using (AddHelper _add = new AddHelper()){_add.AddCount();}Thread.Sleep(500 * i);}});}
}

更多参考:

C# lock关键词/lock语句块、线程锁

C# using 关键字使用整理

EntiryFramework中事务操作(二)

官方参考:https://msdn.microsoft.com/zh-cn/library/system.threading.monitor.aspx

C# 线程同步之排它锁/Monitor监视器类相关推荐

  1. 线程同步 – lock和Monitor

    在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...

  2. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  3. Java同步机制之Monitor监视器与syncrhoized实现原理

    转载请注意原文地址:http://www.cnblogs.com/ygj0930/p/6561667.html  一:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex ...

  4. 转:C# 线程同步技术 Monitor 和Lock

    原文地址:http://www.cnblogs.com/lxblog/archive/2013/03/07/2947182.html 今天我们总结一下 C#线程同步 中的 Monitor 类 和 Lo ...

  5. C语言线程lock与unlock,谈谈线程同步Lock和unLock

    Lock可以使用Condition进行线程之间的调度,它有更好的灵活性,而且在一个对象里面可以有多个Condition(即对象监视器),则线程可以注册在不同的Condition,从而可以 有选择性的调 ...

  6. MFC 多线程及线程同步

    一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

  7. Visual C++线程同步技术

    线程同步的方式有: 临界区 管理事件内核对象 信号量内核对象 互斥内核对象 分别介绍如下: 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进 ...

  8. VC++ MFC 多线程及线程同步(详细、全面总结!)

    更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC    多线程及线程同步                          ...

  9. 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...

最新文章

  1. php7 ext skel_基于PHP7的PHP扩展开发之一(hello word)
  2. 对个人站长职业前景的探讨之路在何方?
  3. 红黑树概念及其相关操作的实现
  4. linux下 安装tengine
  5. 解决sea.js引用jQuery提示$ is not a function的问题
  6. 抖音api开放平台对接_抖音开放一键发布功能 第三方内容可分享至抖音
  7. 为kubernetes(k8s)单独配置kubectl工具
  8. 超详细Gulp打包seajs模块压缩合并,绝对对你项目有帮助 ~
  9. 安全测试(BurpSuite)常见检查点
  10. 计算机专业就业崩溃,计算机专业就业“遇冷说”引发争议
  11. 关于保利威视平台的API调用签名
  12. 反外挂之手写汇编锁血功能
  13. shell 脚本中常见的 if [ $? -ne 0 ]; 意思
  14. 《高楼的性能工程实战课》微服务电商项目技术全解析
  15. 驰网独家英特尔i913900K处理器性能参数一览!Steam游戏专用i913900k服务器!!
  16. 关于毕业必须知道的知识之就业、派遣(1)
  17. 原来PWM这么简单!通过锯齿波作为载波和调制波经过比较,产生相应的PWM输出波形
  18. Calibre 制作电子书
  19. Exception in thread “main“ java.lang.NoClassDefFoundError: org/apache/velocity/context/Context at c
  20. ctfshow---vip限免题目11~20

热门文章

  1. OpenStack部署
  2. 入门Python神经机器翻译,这是一篇非常精简的实战指南
  3. spring注解@Component、@Repository、@Service、@Controller
  4. Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理
  5. SpringMVC4 返回Json数据
  6. php PDO php.ini
  7. 四舍六入五成双银行家算法的 PHP和Javascript实现
  8. 输入框中默认的值,判断是否输入内容
  9. python 根据判断产生新列_pandas DataFrame 根据多列的值做判断,生成新的列值实例...
  10. Linux Kernel TCP/IP Stack — L2 Layer — Linux VLAN device for 802.1.q(虚拟局域网)