C#中Lock关键字的使用

本文深入探讨了C#中的Lock语句如何通过隐式使用Monitor来提供同步功能,强调了避免锁定public类型的重要性,并提出了使用private对象或privatestatic对象变量来保护数据的建议。同时,文章指出在不同操作间应使用不同的锁对象,以避免性能下降甚至死锁,并解释了锁本身带来的系统损耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C# 中的 Lock 语句通过隐式使用 Monitor 来提供同步功能。lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。 

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:

  • 如果实例可以被公共访问,将出现 lock (this) 问题。
  • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
  • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

     最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

总结:

1、如果两个操作是相互影响的,比如读写一个文件,只能允许一个执行,则锁对象应该相同。

      因为lock隐含是Monitor, Monitor类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。

2、如果两个操作是互不相干的,则其锁对象应该不同,如若采用同一个锁,将直接影响其它操作的执行。

      在我们开发过程中,经常为了省事,而只创建一个锁对象,还有的在基类创建一个锁,由子类共用,这是在系统架构中采用工厂模式,经常出现的误区。如果是互不相干的操作,一个操作的执行必须等待另一个操作结束之后才能执行,必然受到了该锁的影响,大大降低了系统的性能,有时候会造成死锁。

3、lock本身也有系统损耗。

      lock本身也需要利用资源,所以不必要的锁会降低系统的性能。在这个试验里,加了锁和不加锁,执行的结果不一样,加了锁输出的结果会缩短。这个你自己也可以写一个小例子进行测试。所以使用锁一定要慎重,不能滥用。

转载于:https://www.cnblogs.com/jimmymi/p/4553905.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值