• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中实现线程同步lock关键字的用法详解

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

作者:ruozeng 字体:[增加 减小] 来源:互联网 时间:2017-05-28

ruozeng 通过本文主要向大家介绍了c#多线程lock,c#线程lock,c#lock用法,c#lock,c#中lock的用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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; 
     } 
} 
</div>

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

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

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

public object SyncRoot 
{ 
     get 
     { 
          return this; 
     } 
} 
</div>

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

lock(x) 
{ 
  DoSomething(); 
} 

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

</div>

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#中实现线程同步lock关键字的用法详解
  • c#多线程中Lock()关键字的用法小结
  • 描述C#多线程中lock关键字的使用分析

相关文章

  • 2017-05-28C#非递归先序遍历二叉树实例
  • 2017-05-28C#中时间的几种格式转换方法
  • 2017-05-28解析美国东部时间与北京时间相互转换的实现代码
  • 2017-05-28C#实现将窗体固定在显示器的左上角且不能移动的方法
  • 2017-05-28C#实现文件上传与下载功能实例
  • 2017-05-28C#实现HSL颜色值转换为RGB的方法
  • 2017-05-28C#实现在网页中根据url截图并输出到网页的方法
  • 2017-05-28C# memcache 使用介绍
  • 2017-05-28Winform在DataGridView中显示图片
  • 2017-05-28淘宝IP地址库采集器c#代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 比较全的一个C#操作word文档示例
    • 关于C#泛型列表List<T>的基本用法总结
    • 基于运算符重载的那些事
    • C#中string.format用法详解
    • c#基数排序Radix sort的实现方法
    • c#判断网络连接状态
    • C# 实例化接口对象的方法
    • 使用位运算实现网页中的过滤、筛选功能实例
    • 如何搭建新的WPF项目框架
    • WPF中不规则窗体与WindowsFormsHost控件兼容问题的解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有