一、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. 开辟html5和css3学习随笔(2015-3-2)

    1.移动端超出指定行数隐藏并显示省略号 <!DOCTYPE html> <html> <head> <meta http-equiv="Conten ...

  2. ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

  3. Nexus入门指南(图文)

    Nexus入门指南(图文) 博客分类: Maven JavamavenGoogleApacheTomcat Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven ...

  4. Linux内核策略介绍

      Linux内核策略介绍学习笔记   主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...

  5. Array(数组)的使用

    方法 说明 Concat() 连接2个或多个数组,并返回结果 Push() 向数组末尾添加一个或多个元素,并返回新的长度 Reverse() 颠倒数组中元素的顺序 Sort() 对数组的元素进行排序 ...

  6. .NET代码自动编译发布

    .NET代码自动编译发布   因本人一直使用.NET开发,在做项目的时候,每次都要涉及到各个环境的部署问题,手工操作容易出错,并且重复劳动多,所以一直在寻找一个能实现自动化部署的方案. 废话不多讲,先 ...

  7. iOS生命周期 & 通知中心

    笔记内容 学习笔记-段玉磊 Stanford course View Controller Lifecycle 这篇文是我记载Developing iOS 7 Apps公开课 第5课的笔记 UITex ...

  8. WCF Restful Service的服务

    构建基于WCF Restful Service的服务 前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面 ...

  9. Glue4Net简单部署基于win服务的Socket程序

    smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...

  10. Jquery框架

    现在Jquery框架对于开发人员基本上是无人不知,无人不晓了,用起来十分的方便,特别是选择器十分强大,提高了我们的开发速度.但是好多人也只是停留在了会用的基础上,我个人觉得会用一个框架不算什么,只能说 ...