[C#基础]说说lock到底锁谁?_weixin_34344403的博客-程序员宝宝

技术标签: c#  

写在前面

最近一个月一直在弄文件传输组件,其中用到多线程的技术,但有的地方确实需要只能有一个线程来操作,如何才能保证只有一个线程呢?首先想到的就是锁的概念,最近在我们项目组中听的最多的也是锁谁,如何锁?看到有同事使用lock(this),也有lock(private static object),那就有点困惑了,lock到底锁谁才是最合适的呢?

lock

首先先上官方Msdn的说法

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。 ThreadInterruptedException 引发,如果 Interrupt 中断等待输入 lock 语句的线程。
通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。

常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
如果实例可以被公共访问,将出现 lock (this) 问题。
如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock("myLock") 问题。
最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
在 lock 语句的正文不能使用 等待 关键字。

Enter指的是Monitor.Enter(获取指定对象上的排他锁。),Exit指的是Monitor.Exit(释放指定对象上的排他锁。)

有上面msdn的解释及Exit方法,可以这样猜测“直到该对象被释放”,”该对象“应该是指锁的对象,对象释放了或者对象改变了,其他的线程才可以进入代码临界区(是不是可以这样来理解?)。

在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。

打个比方,有这样一个情景,很多公司所在的大厦的厕所的蹲位都是小单间型的,也就是一次只能进去一个人,那么为了避免每次进去一个人,那怎么做呢?不就是一个人进去之后顺手把门锁上么?这样你在里面干啥事,外边的人也只能等待你解放完了,才能进入。而蹲位的资源(蹲位,手纸等)是共享的。

最常使用的锁是如下格式的代码段:

private static object objlock = new object();
lock (objlock )
{
    //要执行的代码逻辑
}

为什么锁的对象是私有的呢?还是以厕所为例子吧,私有就好比,这把锁只有你能访问到,而且最好这把锁不会因为外力而有所改变,别人访问不到,这样才能保证你进去了,别人就进不去了,如果是公有的,就好比你蹲位小单间的锁不是安装在里面而是安装在外边的,别人想不想进就不是你所能控制的了,这样也不安全。

lock

原文章列举的demo无法说明问题,已将原文章的demo删除,将修改后的demo迁移到这篇文章。

 [C#基础]说说lock到底锁谁?(补充与修改)

上面说的最多的是lock对象,那么它能不能lock值类型?

答案是否定的,如

当然lock(null)也是不行的,如图

虽然编译可以通过,但是运行就会出错。

lock(string)

string也是应用类型,从语法上来说是没有错的。

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

总结

关于lock的介绍就到这里,有下面几点需要注意的地方

1、lock的是引用类型的对象,string类型除外。

2、lock推荐的做法是使用静态的、只读的、私有的对象。

3、保证lock的对象在外部无法修改才有意义,如果lock的对象在外部改变了,对其他线程就会畅通无阻,失去了lock的意义。

参考文章

http://www.cnblogs.com/jintianhu/archive/2010/11/19/1881494.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34344403/article/details/85686895

智能推荐

智能手表音频特性测试_儿童手表电磁辐射测试这一环节不可少_weixin_39684454的博客-程序员宝宝

随着智能设备的推广,高效、安全、防丢失的儿童手表越来越多地出现在孩子们的手腕上,家长联系和监护孩子也便捷了不少。然而,由于儿童正处于生长发育时期,身体各器官的功能都未发育完善儿童手表手机在使用时又贴近脸或身体,因此,像电磁辐射、声音性能等质量问题将会严重影响儿童消费者的身心健康。作为认证检测分析技术服务第三方,西安安规认证为各类消费类电子产品(如无线通讯产品、智能穿戴产品、智能家居产品、小家电产品...

failed to load the jni shared library "E:/java/jdk../jvm.dll"解决办法_纵马饮白虹的博客-程序员宝宝

有两种情况,一种是提示的目录中没有jvm.dll文件,还有一种是jdk和IDE(即eclipse、myeclipse、itellij idea等)版本不对,如一个是64位一个是32位。第一种的解决办法就是复制一份jvm.dll文件到相应的目录。第二种版本不对也有办法,不用卸一个再重装.....

Quartz使用->调度任务的TRIGGER_STATE突然变成了ERROR_trigger_state error_不喜欢吃猫的鱼的博客-程序员宝宝

spring系列之 @Value注解闲言:都说临时抱佛脚,你不努力的时候连佛都会踢你一脚!文章目录spring系列之 @Value注解一、@Value注解基本功能二、使用方法1.直接在类中使用@Value( "${key}")2.参数默认值设定三、收尾一、@Value注解基本功能      话不多说,这个注解可以帮助你快速的获取到配置文件中的某项配置。 注意:使用这个注解的前提是一定要在spring环境下才能使用,否则无效!二、使

倍福twincat3软件下载方式_~_ _~的博客-程序员宝宝

倍福twincat3软件下载方式倍福公司简介twincat3软件下载地址下载内容下载方式以及经验介绍倍福公司简介倍福公司致力于实现基于 PC 控制技术的开放式自动化系统。产品范围包括工业 PC、现场总线组件、驱动技术和自动化软件。这些产品线既可作为独立的组件来使用,也可将它们集成到一个完整的控制系统中,适用于各种行业领域。Beckhoff 公司始终坚持“自动化新技术”作为公司的发展理念,其自动...

torch 的 3种矩阵乘法运算_torch 矩阵乘法_培之的博客-程序员宝宝

说明 2 维 tensor 与 2 维 tensor,torch.matmul 函数也是执行矩阵乘法。会得到 torch.Size([1]) 而不是 torch.Size([]),Vec3 的 shape 是 torch.Size([])。结果和 torch.mm 计算出来的例 2 的结果一样的。注,输入的两个 tensor 的 shape 都是。当操作符是最最最自然的 “*” 时,执行的时。输出的 tensor 的shape 也是。的矩阵对应相乘,拼成一个。将 Mat1 修改为。.........

IC笔试: 时钟约束中 clock,generated clock ,virtual clock区别与联系[email protected]的博客-程序员宝宝

时钟约束sdc常用的命令有:creat_clockcreat_generated_clockset_clock_uncertaintyset_clock_groups时钟的三要素:Waveform ,uncertainty 和clock groupcreat_clock主要定义一个clock的source 源端,周期和信号上升沿下降沿的时间点,例如:这个时钟描述成的sdc语句就是creat_clock -name SYSCLK -period 20-waveform {0 5}[get

随便推点

快速幂与(同余)快速幂_同余幂和快速幂_God Unique的博客-程序员宝宝

快速幂别人已经说得很明白了,我就不说了。转载CXCXCX的快速幂详解同余快速幂建议先看搜狗百科了解同余,再看大佬性质大全。重点记得基础同余和费马小定理。搜狗百科——同余转载SeanOcean大佬的同余性质大全#include<iostream>using namespace std;//快速幂//int quick_power(int a,int b)//{/...

SAP-ABAP-金额字段特殊转换_abap char转换为cruu_Qunending的博客-程序员宝宝

当货币币别为越南盾VND等币值很小的货币时,SAP后台表存储会将小数位也利用上,如下图所示,下图中净价的个位及十位存储到了后台表的小数点上。我们在做自开发报表时取的数据是表中数据,比实际少两位。需要用一个语句做转换.具体的转换位数是根据SPRO中币别的配置。WRITE <fs_edi_ekpo>-netpr TO l_tmp_str CURRENCY <fs_edi_ekko>-waers NO-GROUPING.<fs_edi_ekpo>-net..

Android Studio(10)---使用 Layout Editor 构建 UI_layouteditor_zhangbijun1230的博客-程序员宝宝

使用 Layout Editor 构建 UI在 Android Studio 的 Layout Editor 中,您可以通过将小部件拖动到视觉设计编辑器来快速构建布局,无需手动编写布局 XML。此编辑器可在各种 Android 设备和版本中预览布局,并且您可以动态地调整布局大小以确保它可以很好地适应不同屏幕尺寸。Layout Editor 在使用 ConstraintLayout 构建新布局时...

QT Echarts 使用详解(一)ECharts下载\示例\动态缩放_echarts 示例下载_双子座断点的博客-程序员宝宝

Echarts是百度的一款可视化界面开发的平台,里面的地图以及数据可视化内容十分丰富,适合用于一些大屏数据显示项目或者一些ui界面开发。每一个ECharts图表使用一个无边框的QWebView来展示,这样多个不同类型的ECharts图表就是多个封装不同类型ECharts图表的QWebView(html加载入QWebView窗口来实现),每一个模块封装的数据用qt预留接口调用js代码实现修改html的功能,最终达到代码操作qt即可操作图表的功能。ECharts 官网下载:本文作者原创,未经允许禁止转载。

睢宁微服务平台下载_掌上睢宁app下载-掌上睢宁官方版下载v1.0-飞飞世界_北大教授袁春希的博客-程序员宝宝

掌上睢宁是一款全新上线专门为睢宁打造的手机新闻资讯服务应用软件。掌上睢宁app上用户可以随时了解本地最新的资讯和信息,每天都有大量的新闻更新让你快速了解当地的详细情况。并且用户随时可以在平台上办理相关的政务,使当地老百姓足不出户就能解决很多生活上的问题!掌上睢宁简介掌上睢宁是睢宁本地新闻中心和同城服务提供的综合中心。软件有着本地最大的新闻发布服务和在线社交功能,可找工作,线上交友,观看本地电台直播...

Install socat on Mac OSX_mac 安装socat 权限被拒绝_mike__lee的博客-程序员宝宝

About the AppApp name: socatApp description: netcat on steroidsApp website: http://www.dest-unreach.org/socat/Install the AppPress Command+Space and type Terminal and press enter

推荐文章

热门文章

相关标签