C#中的Lock机制

lock关键字在C#中用于实现线程同步,确保代码块在多线程环境中安全执行。它通过获取互斥锁防止并发访问,确保公用变量的值不出现异常。lock不能锁定null或字符串,因为字符串在CLR中被暂留,可能导致意外的锁竞争。同时,应避免锁定公共对象和值类型,推荐锁定私有或受保护的实例成员。正确的lock使用有助于提高多线程程序的稳定性。
摘要由CSDN通过智能技术生成

Lock在MSDN的定义:

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

lock应用:经常用于防止多线程操作导致公用变量值出现不确定的异常,用于确保操作的安全性。

如上面代码,当线程1和线程2都来调用这个方法的时候,当线程1先调用,线程1就会申请互斥锁,当线程2再来执行时,发现lock这里已经申请了互斥锁,所以线程2需要等待线程1执行完成后,释放互斥锁,线程2才能申请新的互斥锁并执行lock里面的代码。

注意:

  1. lock不能锁定空值,但Null是不需要被释放的。
  2. lock不能锁定string类型,虽然它也是引用类型的。因为字符串类型被CLR“暂留”。即整个程序中任何给定字符串都只有一个实例,具有相同内容的字符串都代表着同一个实例。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中与该字符串具有相同内容的字符串。因此,最好锁定不会被暂留的私有或受保护成员。
  3. 值类型不能被lock,因为前文标红字的“对象被释放”,值类型不是引用类型的
  4. lock就避免锁定public 类型或不受程序控制的对象
  5. lock锁定的对象是一个程序块的内存边界

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值