【问题标题】:C# lock a private static objectC# 锁定私有静态对象
【发布时间】:2014-06-23 21:49:52
【问题描述】:

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

    private Object thisLock = new Object();

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

    private static Object thisLock = new Object();

然后更多来自 MSDN 页面,

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

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

感谢您的宝贵时间。

【问题讨论】:

  • 是的,它们都会锁定同一个对象实例。那是问题吗?这似乎是你的意图。当然,对于静态,每个实例都使用相同的锁(而不是不同的锁),但这是静态的预期......我错过了你的问题吗?

标签: c# .net multithreading locking


【解决方案1】:

所以如果是静态对象,而不是字符串,同一个方法被多次调用会不会有问题

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

基本准则:

  • 让您的 lockObject 与受保护的资源保持一对一的密切关系。在数量、范围和寿命方面。所以使用静态 lockObject 来保护静态数据。
  • 尽可能保持 lockObject 的私密性,公开它会增加死锁的风险。出于这个原因,还要避免锁定类型和字符串。

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

所有访问共享资源的代码必须共享(锁定)同一个 lockObject 实例。私人锁是行不通的。

【讨论】:

  • 如果我有一个方法会被并行调用多次,并且这个方法会锁定lockObject,是否存在线程安全问题?如果是,我该怎么做才能确保线程安全?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多