- 浏览: 195561 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (231)
- C++学习 (41)
- vc学习 (25)
- vc异常 (4)
- Flex (2)
- Ext (0)
- java学习笔记 (15)
- mysql学习笔记 (1)
- ibatis学习笔记 (7)
- struts1学习笔记 (1)
- hibernate学习笔记 (3)
- javascript学习笔记 (8)
- eclipse快捷键 (2)
- 英语学习 (1)
- cmd (1)
- eclipse 配置 (2)
- 其他 (4)
- JAVASE (34)
- firefox (1)
- linux (8)
- Apache (6)
- cms (22)
- jsuc (10)
- html (3)
- css (1)
- 作图 (2)
- vs2012 (2)
- 编码转换 (12)
- work_unicode (1)
- work_webbrowser (1)
- work_trade_quotes_login (1)
- c#学习 (38)
- wpf学习 (31)
- wpf快速学习 (1)
- VB学习 (1)
- NSIS (4)
- log4cpp (3)
- 学习web (1)
- 经验 (1)
- c_汇编 (1)
最新评论
C#笔记21:多线程之线程同步中的锁定lock、Monitor
1:什么是锁
2:如何选择锁定对象
3:如何锁定集合
4:Monitor
1:什么是锁
lock 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
2:如何选择锁定对象
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上面的示例中,锁的范围限定为此函数,因为函数外不存在任何对对象 lockThis 的引用。如果确实存在此类引用,锁的范围将扩展到该对象。严格地说,提供的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
复制代码
public class TestThreading
{
private System.Object lockThis = new System.Object();
public void Process()
{
lock (lockThis)
{
// Access thread-sensitive resources.
}
}
}
复制代码
通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行时 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。
3:如何锁定集合
每个非泛型集合,都提供了一个SyncRoot的属性,如果要锁定集合,请锁定此属性。遗憾的是,我们现在已经不鼓励使用非泛型集合了,所以,泛型集合的锁定,请自己选择或创建一个锁定对象来实现。
4:Monitor
lock代码在经编译后,会自动转换为Monitor代码,所以两者没有任何区别。唯一的区别就在于lock使用起来更加简单。
复制代码
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
1:什么是锁
2:如何选择锁定对象
3:如何锁定集合
4:Monitor
1:什么是锁
lock 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
2:如何选择锁定对象
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上面的示例中,锁的范围限定为此函数,因为函数外不存在任何对对象 lockThis 的引用。如果确实存在此类引用,锁的范围将扩展到该对象。严格地说,提供的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
复制代码
public class TestThreading
{
private System.Object lockThis = new System.Object();
public void Process()
{
lock (lockThis)
{
// Access thread-sensitive resources.
}
}
}
复制代码
通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行时 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。
3:如何锁定集合
每个非泛型集合,都提供了一个SyncRoot的属性,如果要锁定集合,请锁定此属性。遗憾的是,我们现在已经不鼓励使用非泛型集合了,所以,泛型集合的锁定,请自己选择或创建一个锁定对象来实现。
4:Monitor
lock代码在经编译后,会自动转换为Monitor代码,所以两者没有任何区别。唯一的区别就在于lock使用起来更加简单。
复制代码
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
发表评论
-
byte数组直接输出
2016-07-19 11:38 1204byte数组直接输出 BitConverter.ToStrin ... -
wfi:WindowsFormsHost焦点设置
2016-07-05 17:56 527<wfi:WindowsFormsHost> ... -
C#_WPF_WPF用户控件库
2016-04-12 11:37 758新建项目》window桌面》WPF用户控件库 -
DependencyProperty.UnsetValue_WPF涉及到资源的嵌套引用,被引用的资源要定义在引用的资源前面
2015-10-27 15:09 1911错误 1 “{DependencyProperty.Unset ... -
string格式的日期时间字符串转为DateTime类型
2015-08-05 14:22 917string格式的日期时间字符串转为DateTime类型 / ... -
checkbox
2015-07-28 17:18 502private void Chec ... -
自定义DataGrid样式
2015-06-26 22:03 703<ResourceDictionary xmlns=&q ... -
x:Name x:Key Name区别
2015-06-25 15:40 556x:Name x:Key Name区别 1、x:Key 只 ... -
work_代码添加
2015-06-23 17:15 468<UserControl x:Class=" ... -
FindName和VisualTreeHelper
2015-06-19 13:23 718int iCount = this.dataGridCan ... -
理解WPF中的视觉树和逻辑树(转载)
2015-06-19 13:00 554理解WPF中的视觉树和逻辑树 理解WPF中的 ... -
理解WPF中的视觉树和逻辑树(转载)
2015-06-19 12:58 1598理解WPF中的视觉树和逻 ... -
GetEnumerator
2015-06-19 12:39 617IEnumerator enumerator = this ... -
资源文件获取配置
2015-06-18 16:03 340object obj = Application.Curren ... -
Pack URI
2015-06-18 15:41 651主要用来定位 资源文 ... -
wpf学习之ObservableCollection<T>相关知识
2015-04-23 11:10 3268本篇学习了ObservableCollection<T& ... -
C#学习之DateTime
2015-04-23 10:30 413DateTime string.Format("{ ... -
c#学习之TimeSpan
2015-04-23 10:29 7301 DateTime dateNow = DateTime ... -
XML特殊字符和空格 换行 转义符(转)
2015-03-25 16:27 6109XML特殊字符和空格 换行 ... -
C#:struct的陷阱:无法修改“xxx”的返回值,因为它不是变量(转)
2015-03-25 14:01 1337C#:struct的陷阱:无法修改“xxx”的返回值,因为它不 ...
相关推荐
对于引用类型和非线程安全的资源的同步处理,有四种相关处理:lock关键字,监视器(Monitor), 同步事件和等待句柄, mutex类。 Lock关键字 本人愚钝,在以前编程中遇到lock的问题总是使用lock(this)一锁了之,出...
多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄[整理].pdf
C#中使用Monitor类、Lock和Mutex类来同步多线程的执行.pdf
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
c# 多线程 lock monitor 同步问题解决
C#中的多线程C#中的多线程C#中的多线程C#中的多线程C#中的多线程
C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例C# 多线程实例
c#编写串口通讯代码多线程实现,逻辑与界面分离。发送与接收都为单独线程
C#中使用MONITOR类LOCK和MUTEX类来同步多线程的执行[归纳].pdf
C#线程同步的几种方法 C#线程同步的几种方法
C#的多线程同步,C#中四种进程或线程同步互斥的控制方法
c# window服务多线程实例
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
C# 多线程 线程池 线程同步 单线程 线程的开始、挂起、恢复、结束、同步和异步
本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过阅读本书,你将学到: 使用原始线程、异步线程,...
C#多线程互斥实例 多线程获取同一变量(不重复)。是一个很好的学习例子
C#多线程复制代码: 1.运用线程和线程池的知识 2.可以实现 限制线程的数量 进行上传 3.用到FileStream类的读写功能 总之 大家可以参考一下!
C#多线程C#多线程C#多线程C#多线程C#多线程
C#_线程同步lock,Monitor,Mutex,同步 互斥 监控 锁
c# 上位机,采用多线程技术及模拟消息队列