前几天与同事激烈讨论了一下,有一点收获,记录起来。

  首先给出MSDN的定义:

  lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

  先来看看执行过程,代码示例如下:

  假设线程A先执行,线程B稍微慢一点。线程A执行到lock语句,判断obj是否已申请了互斥锁,判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实),如果不存在,则申请一个新的互斥锁,这时线程A进入lock里面了。

  这时假设线程B启动了,而线程A还未执行完lock里面的代码。线程B执行到lock语句,检查到obj已经申请了互斥锁,于是等待;直到线程A执行完毕,释放互斥锁,线程B才能申请新的互斥锁并执行lock里面的代码。

  接下来说一些该lock什么对象。

  为什么不能lock值类型,比如lock(1)呢?lock本质上Monitor.Enter,Monitor.Enter会使值类型装箱,每次lock的是装箱后的对象。lock其实是类似编译器的语法糖,因此编译器直接限制住不能lock值类型。退一万步说,就算能编译器允许你lock(1),但是object.ReferenceEquals(1,1)始终返回false(因为每次装箱后都是不同对象),也就是说每次都会判断成未申请互斥锁,这样在同一时间,别的线程照样能够访问里面的代码,达不到同步的效果。同理lock((object)1)也不行。

  那么lock("xxx")字符串呢?MSDN上的原话是:

  锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留”。 这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。而且lock(this)只对当前对象有效,如果多个对象之间就达不到同步的效果。

  lock(typeof(Class))与锁定字符串一样,范围太广了。某些系统类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。而自定义类推荐用私有的只读静态对象,比如:private static readonly object obj = new object();为什么要设置成只读的呢?这时因为如果在lock代码段中改变obj的值,其它线程就畅通无阻了,因为互斥锁的对象变了,object.ReferenceEquals必然返回false。

一起谈.NET技术,C#中的lock关键字相关推荐

  1. NET面试题:C#中的lock关键字有何作用

    NET面试题:C#中的lock关键字有何作用 2011-03-01 08:42:04 标签:.net面试题 .net电子书 .net教学视频 .net 更多.net面试题,.net电子书,.net教学 ...

  2. 技术思考:也谈知识图谱平台中的数据流程与构建范式思考

    笔者之前写过一篇文章<关于知识图谱标准化构建平台的思考:知识图谱只能做项目,不能做平台?>,地址:https://blog.csdn.net/lhy2014/article/details ...

  3. 浅谈数字媒体艺术中的技术应用-3-工具介绍(二)

    上一篇文章介绍了数据可视化工具Processing和OpenFrameWorks,以及开源电子硬件Arduino和RaspberryPI.这一篇继续把剩下的几个工具进行逐一的介绍. 商用游戏引擎:Un ...

  4. 计算机技术在现代地球科学中的重要性,浅谈GIS技术在地球科学中的应用.doc

    浅谈GIS技术在地球科学中的应用.doc 浅谈GIS技术在地球科学中的应用 中图分类号:P9 文献标识码:A 文章编号:1007-0745(2014)02-0181-01 摘要:地理信息系统是指带各种 ...

  5. 浅谈BIM技术在“智慧工地”建设中的应用

    浅谈BIM技术在"智慧工地"建设中的应用 随着信息技术的不断发展,建筑行业的信息化程度不断提高,BIM技术在建设行业得到了广泛的推广和应用,同时,伴随着大数据时代的到来,智慧城市的 ...

  6. 《浅谈条形码技术在连锁超市中的应用》论文笔记(二)

    一.基本信息 标题:浅谈条形码技术在连锁超市中的应用 时间:2016 来源:品牌(西京学院) 关键词:条形码技术; 连锁超市; 条码的应用; 二.研究内容 1.问题定义: 条形码作为一项以计算机技术和 ...

  7. 浅谈数字媒体艺术中的技术应用-1-技术概述

    这个是我近期在某个大学做的讲座,主要针对的是数字媒体艺术专业的大一-大三的学生,大概听讲座的有100个学生,老师有6-8个.主要讲述了数字媒体艺术专业的同学不熟悉的计算机技术,但是他们到做毕设的时候确 ...

  8. 计算机动画 vr技术应用,浅谈VR技术在动画专业教学中的运用

    摘要:VR技术是网络计算机技术快速发展背景下衍生的新技术,其以计算机为载体,能够对复杂数据进行高效的交互和可视化操作,当前,VR技术逐渐向教育领域延伸,作为一种新的教学技术具有非常广阔的前景.本文以V ...

  9. 浅谈数字媒体艺术中的技术应用-4-技术路线和学习地图

    我们先来看下制作一个互动展示装置的设计思路和技术实现. 当我们大脑里面有一个点子之后,怎么最终输出成一个互动展示装置呢?首先我们需要设计一个外观造型,其次我们需要评估一下这个装置的互动方式,是用VR眼 ...

最新文章

  1. python中remove函数是什么意思,python中pop函数和remove函数有什么区别
  2. 对于生活我选择了无奈
  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符
  4. wordpress url index.php,WordPress对URL的路由解析过程详解
  5. 神舟战神怎么装win11系统
  6. 集成学习-蒸汽量预测案例
  7. tablelayout
  8. 基于Python的心电图上位机诊断软件
  9. php开发pdf,使用PHP编写PDF(PDFLib)
  10. 【NLP】中文分词方法:规则分词(正向最大匹配、逆向最大匹配、双向最大匹配)
  11. mysql root有初始密码_mysql的root初始密码
  12. 大数据常用非关系型数据库汇总(NoSQL)
  13. 5W无线充发射IC芯片方案XPM7105、XPM7305 无线充SOC芯片
  14. cesium面积测量
  15. RIM Hong Kong地址和地图
  16. C++11标准模板(STL)- 算法 - 数值运算 (std::accumulate)
  17. 如何在网页中设置一个定时器计算时间?
  18. jsbox 导入_JSBox脚本分享
  19. 免费正版 IntelliJ IDEA license 详细指南
  20. 图片文字识别,手机里的图片转文字的方法

热门文章

  1. phpnow修改默认站点根目录的方法
  2. css flexbox水平垂直
  3. Response.Clear() Response.ClearContent()和Response.ClearHeaders()之间的区别
  4. [导入]C#中的“装箱”与“拆箱”
  5. 程序员怎样练出倒三角身材
  6. 总结《Ray Tracing from the Ground Up》
  7. 大数据有哪些分析误区
  8. java学习(五)包
  9. tolua unity 报错_Unity3D热更新之LuaFramework篇[01]--从零开始
  10. 型管件的作用_W型柔性铸铁排水管适用范围