C#中实现线程同步lock关键字的用法详解

所属分类: 软件编程 / C#教程 阅读数: 54
收藏 0 赞 0 分享

1. lock关键字保证一个代码块在执行的过程中不会受到其他线程的干扰,这是通过在该代码块的运行过程中对特定的对象加互斥锁来实现的。

2. lock关键字的参数必须是引用类型的对象。lock对基本数据类型如int,long等无效,因为它所作用的类型必须是对象。如果传入long类型数据,势必被转换为Int64结构类型,则加锁的是全新的对象引用。如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的。

3. lock(this)的使用要慎重。共有类型中使用lock(this),如果新的对象被创建并加锁,极易造成死锁。

4. 锁定ICollection类型对象时,应lock其SyncRoot属性。

SyncRoot属性在接口ICollection中声明,其实现方式各不相同。

例如在Collection(System.Collections.ObjectModel)中实现如下:

object ICollection.SyncRoot 
{ 
     get 
     { 
          if (this._syncRoot == null) 
          { 
               ICollection items = this.items as ICollection; 
               if (items != null) 
               { 
                    this._syncRoot = items.SyncRoot; 
               } 
               else 
               { 
                    Interlocked.CompareExchange(ref this._syncRoot, new object(), null); 
               } 
          } 
          return this._syncRoot; 
     } 
} 

而在List<T>,ArrayList等类中实现如下:

object ICollection.SyncRoot 
{ 
     get 
     { 
          if (this._syncRoot == null) 
          { 
               Interlocked.CompareExchange(ref this._syncRoot, new object(), null); 
          } 
          return this._syncRoot; 
     } 
} 
  

在Array类中则直接返回了this:

public object SyncRoot 
{ 
     get 
     { 
          return this; 
     } 
} 

5. lock关键字是用Monitor(管程)类实现的

lock(x) 
{ 
  DoSomething(); 
} 

System.Object obj = (System.Object)x; 
System.Threading.Monitor.Enter(obj); 
try 
{ 
  DoSomething(); 
} 
finally 
{ 
  System.Threading.Monitor.Exit(obj); 
} 

以上两段代码是等效的。(MSDN)

使用lock关键字相对于Monitor类在使用上更简单,也更加保险。

更多精彩内容其他人还在看

C#使用oledb读取excel表格内容到datatable的方法

这篇文章主要介绍了C#使用oledb读取excel表格内容到datatable的方法,涉及C#操作oledb及datatable的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用oledb操作excel文件的方法

这篇文章主要介绍了C#使用oledb操作excel文件的方法,涉及C#中oledb操作excel的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用IHttpModule接口修改http输出的方法

这篇文章主要介绍了C#使用IHttpModule接口修改http输出的方法,涉及C#操作IHttpModule接口的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#给图片加水印的简单实现方法

这篇文章主要介绍了C#给图片加水印的简单实现方法,涉及C#操作图片的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#生成随机数的方法小结

这篇文章主要介绍了C#生成随机数的方法,实例总结了C#生成随机数的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#使用jQuery实现无刷新评论提交的方法

这篇文章主要介绍了C#使用jQuery实现无刷新评论提交的方法,涉及C#结合jQuery进行Ajax操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#读取中文文件出现乱码的解决方法

这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像对比度调整的方法

这篇文章主要介绍了C#图像对比度调整的方法,涉及C#实现图像对比度操作的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像灰度级拉伸的方法

这篇文章主要介绍了C#图像灰度级拉伸的方法,涉及C#灰度操作的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#图像线性变换的方法

这篇文章主要介绍了C#图像线性变换的方法,涉及C#操作图像线性变换的相关技巧,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多