C# 线程同步之排它锁/Monitor监视器类
一、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);
}
});
}
}
更多参考:
官方参考:https://msdn.microsoft.com/zh-cn/library/system.threading.monitor.aspx
C# 线程同步之排它锁/Monitor监视器类的更多相关文章
- 线程同步 – lock和Monitor
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...
- C#线程同步与死锁Monitor
在上一讲介绍了使用lock来实现C#线程同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public stat ...
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- 【Java基础】7、Java同步机制之Monitor监视器与syncrhoized实现原理
一:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex),即值为1的信号量. 它内置与每一个Object对象中,相当于一个许可证.拿到许可证即可以进行操作,没有拿到则需 ...
- Java同步机制之Monitor监视器与syncrhoized实现原理
转载请注意原文地址:http://www.cnblogs.com/ygj0930/p/6561667.html 一:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex ...
- 多线程状态与优先级、线程同步与Monitor类、死锁
一.线程状态 二.线程优先级 三.初步尝试多线程 class Program { static void Main(string[] args) { while (true) { MessagePri ...
- 转:C# 线程同步技术 Monitor 和Lock
原文地址:http://www.cnblogs.com/lxblog/archive/2013/03/07/2947182.html 今天我们总结一下 C#线程同步 中的 Monitor 类 和 Lo ...
- C#编程总结(三)线程同步
C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多 ...
- [转]C#编程总结(三)线程同步
本文转自:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可 ...
随机推荐
- 【UNIX网络编程(一)】套接字地址结构、网络字节顺序和地址转换功能
介绍:应该用在网络编程实现每个套接字地址结构.所以主套接字地址结构后前提网络计划编制,地址结构可以在两个方向上发送:从工艺到内核和内核处理.构中的二进制值之间进行转换. 大多数套接字函数都须要一个指向 ...
- "手机信号放大器" 让手机信号增强的办法
我的住处信号及其的差,电话基本打不进来,放大器的话便宜的也得一百多,于是自己尝试各种办法让自己的手机有信号,于是奇迹般的成功了: 将手机放于铁缸内,并45度角斜放,刚好淹没手机为佳.于是信号奇迹般的3 ...
- 路由模块router实现step1
hashchange事件 参考:http://www.cnblogs.com/rubylouvre/archive/2012/10/24/2730599.html 需要解决的问题: 1.IE6/7及兼 ...
- IOS UI 第十一篇: UITABLEVIEW
DIY a tableviewcell : - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *) ...
- Redis一些命令总结
链接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将 ...
- let和const关键词
ECMAScript 6中的let和const关键词 2013-11-28 21:46 by BarretLee, 21 阅读, 0 评论, 收藏, 编辑 ECMAScript 6中多了两个定义变量的 ...
- Jquery EasyUI中treegrid
Jquery EasyUI中treegrid的中右键菜单和一般按钮同时绑定事件时的怪异事件 InChatter系统开源聊天模块前奏曲 最近在研究WCF,又因为工作中的项目需要,要为现有的系统增加一 ...
- [转]The Best Plugins for Sublime Text
Source: http://ipestov.com/the-best-plugins-for-sublime-text/ Good day, everyone! I tried to collect ...
- 企业架构研究总结(41)——企业架构与建模之ArchiMate的由来和详述(上)
终于完成了关于企业架构框架理论的总结,谢谢各位看官的支持,能挺过之前过于理论化的叙述而坚持到现在着实不易,笔者也自愧没有实践经验可以分享,希望日后有兴趣的看官能够不吝赐教.在本系列后面的也是最后一个大 ...
- django下载文件
赶快记录一下写的一个django下载文件的例子,以便以后复习: 在views.py中设置 from django.core.servers.basehttp import FileWrapper im ...