C#锁定一个私有静态对象

时间:2014-06-23 21:49:52

标签: c# .net multithreading locking

嗨,根据http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx 可以声明一个对象用于锁定:

    private Object thisLock = new Object();

但是当我需要从静态方法锁定它时,我需要将其声明为静态:

    private static Object thisLock = new Object();

然后更多来自MSDN页面,

  

lock(" myLock")是一个问题,因为进程中使用相同字符串的任何其他代码都将共享同一个锁。

因此,如果它是一个静态对象而不是一个字符串,当多次调用同一个方法时,它会遇到问题,每个方法都会尝试锁定thisLock,因为它是同一个静态对象所以他们实际上是在共享锁?

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

  

因此,如果它是一个静态对象,而不是一个字符串,当多次调用相同的方法时会出现问题

不完全是。字符串很特殊,可以实习。您无法像其他对象那样控制其可见性。

基本准则:

  • 使您的lockObject与受保护资源保持密切的1对1关系。在数量,范围和寿命。因此,使用静态lockObject来保护静态数据。
  • 将lockObject保持为尽可能私有,暴露它会增加死锁的风险。因此,还要避免锁定类型和字符串。
  
    

因为它是相同的静态对象,所以它们实际上是共享锁?

  

访问共享资源的所有代码都共享(锁定)同一个lockObject实例。私人锁不起作用。