线程学习7——lock语句

什么是lock语句?

lock语句是设置锁定和解除锁定的一种简单方式。

为什么使用lock语句?

在使用多线程的过程中,会出现很多难以发现的问题,比如竞态条件与死锁,为了避免这些同步问题,所以使用lock语句,当然这并不是解决同步问题的唯一方法。

lock语句的作用:

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

lock语句的用法:

lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。 此语句的形式如下:

Object thisLock = new Object();
lock (thisLock)
{
// Critical code section.
}

lock语句的注意事项:

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

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)lock (typeof (MyType))lock ("myLock") 违反此准则:
  • 如果实例可以被公共访问,将出现 lock (this) 问题。

        第一种情况:

       1.同一个对象,不同线程。lock (this) 不会出现问题的例子

     

       2.不同对象,不同线程。lock (this) 会出现问题的例子


        第二种情况:如果一个类是公有的时,应该避免在基方法或属性中使用lock(this)语句,因为如果有其他人使用你的组件,

        它并不了解你的组件内部是否使用了锁,当组件内部使用了锁,而使用者又在类外部对类实例尝试加锁,则可能导致一个死锁。

        例如:

  • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。


  • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock("myLock") 问题。  

      例如:

      string a = "String Example";
      string b = "String Example";
      string c = (new StringBuilder()).Append("String Example").ToString();
      Console.WriteLine("a==b? {0}", object.ReferenceEquals(a, b));
      Console.WriteLine("a==c? {0}", object.ReferenceEquals(a, c));

    上面程序执行的结果是:
     a==b? True
     a==c? False

     从上面可以看出,a和b指向的是同一个引用,而lock正是通过引用来区分并加锁临界代码段的。也就是说,如果在我们一程序的一个部分中使用了 lock("thisLock")进行加锁,而在程序的另一个位置同样也使用lock("thisLock")进行加锁,则极有可能导致一个死锁,因而是 很危险的。实际上,不只是lock("thisLock")这样的语句,在lock中使用string类型的引用都有可能导致死锁。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值