一、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 = ;
static void CountAdd()
{
Monitor.Enter(_MyLock); //获取排它锁
Count++;
Console.WriteLine(Count);
if (Count == )
{
Count = ;
}
Monitor.Exit(_MyLock); //释放排它锁
}
public static void TestOne()
{
//启动4个线程,累加Count
for (int i = ; i < ; i++)
{
Task.Factory.StartNew(() =>
{
while (true)
{
CountAdd();
Thread.Sleep( * i);
}
});
}
}

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

2.使用锁定结果会正常

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

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

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

1.继承了IDisposable接口的封装

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

2.调用代码块

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

更多参考:

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

C# using 关键字使用整理

EntiryFramework中事务操作(二)

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

C# 线程同步之排它锁/Monitor监视器类的更多相关文章

  1. 线程同步 – lock和Monitor

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

  2. C#线程同步与死锁Monitor

    在上一讲介绍了使用lock来实现C#线程同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public stat ...

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

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

  4. 【Java基础】7、Java同步机制之Monitor监视器与syncrhoized实现原理

    一:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex),即值为1的信号量. 它内置与每一个Object对象中,相当于一个许可证.拿到许可证即可以进行操作,没有拿到则需 ...

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

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

  6. 多线程状态与优先级、线程同步与Monitor类、死锁

    一.线程状态 二.线程优先级 三.初步尝试多线程 class Program { static void Main(string[] args) { while (true) { MessagePri ...

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

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

  8. C#编程总结(三)线程同步

    C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多 ...

  9. [转]C#编程总结(三)线程同步

    本文转自:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可 ...

随机推荐

  1. SQL Server 数据库定时自动备份

    原文:SQL Server 数据库定时自动备份 SQL Server 数据库定时自动备份——每天定时备份,保留前8天的备份 利用SQL Server代理新建作业来定期备份 1)在数据库库的[SQL S ...

  2. 【原创】窥视懒人的秘密---android下拉刷新开启手势的新纪元

    小飒的成长史原创作品:窥视懒人的秘密---android下拉刷新开启手势的新纪元转载请注明出处 **************************************************** ...

  3. 将DataTable内容导出到Excel表格的两种方法

    方法一:循环DataTable单元格内容拼接字符串,利用StreamWriter的Write方法将字符串写入Excel文件中 这种方法很实现很简单.拼接字符串时,每个单元格之间添加'\t'(表示一个占 ...

  4. HDU 4945 2048(DP)

    HDU 4945 2048 题目链接 题意:给定一个序列,求有多少个子序列能合成2048 思路:把2,4,8..2048这些数字拿出来考虑就能够了,其它数字不管怎样都不能參与组成.那么在这些数字基础上 ...

  5. [转]SQL2005后的ROW_NUMBER()函数的应用

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...

  6. c#计算2个字符串的相似度

    直接来代码 public static float levenshtein(string str1, string str2) { //计算两个字符串的长度. int len1 = str1.Leng ...

  7. .NET中文乱码解决方案

    前言:最近升级一个由VS05开发的项目,当迁移至VS10后,试运行,啊~!我文盲了,怎么一个汉字都不认识了!(乱码纷纷的说) 说明:本文以将项目改为UTF8编码为例. 解决之道 1.修改配置文件 &l ...

  8. Sparse Filtering

    Sparse Filtering 当前很多的特征学习(feature learning)算法需要很多的超参数(hyper-parameter)调节, Sparse Filtering则只需要一个超参数 ...

  9. 新部署的linux web服务器error Host ‘*.*.*.*’ is not allowed to connect to this MySQL server

    最近上头交给我个任务,把WINDOWS平台下开发的网站,部署在LINUX环境上. 把mysql安装好了,所有表单都导入没问题,然后代码都放在tomcat下的webapps文件夹下了,主页 面可以正常显 ...

  10. HttpStack及其实现类

    HttpStack及其实现类 前两篇已经对网络请求流程已经梳理了个大概,这次我们着重看一下HttpStack和它的其实现类.我们之前在Network篇讲过它仅有一个实现类,而今天我们讲的HttpSta ...