编辑:事实证明,当我浏览时,我发现一个问题似乎与我之前没有发现的问题相同:Difference between lock(locker) and lock(variable_which_I_am_using)
我正在查看一些代码并试图让我的头脑围绕锁定的东西,我想我已经到了那里。
现在我注意到在一些代码中我正在审查一个对象是这样创建的:
private HashSet<Graphic> clustersInUse = new HashSet<Graphic>();
然后在代码中进一步使用如下:
lock (clustersInUse)
{
// Do something with the Hashset
}
现在,这样做而不是为锁创建一个特定对象有问题吗?像这样:
private object clusterLocker = new object();
如果上面的 clustersInUse
以某种方式放入公共(public)属性,会发生什么情况?
此外,如果某些东西试图访问 clustersInUse
而没有锁定它,而它在另一个线程中被锁定,那么会发生什么?
最佳答案
一般规则是您要控制锁定对象的范围,以防止某些未知代码导致意外行为。在这种情况下,您使用的是私有(private)实例变量,因此只要您不分发对它的引用就可能没问题。
如果您正在分发引用并锁定它,而其他代码正在锁定这些引用(例如,在修改集合时),更改行为很容易引入线程错误。
如果有人将它放入一个公共(public)属性(property)中,如果他们锁定了它,那么您对 lock 的调用将被阻止,直到他们将其解锁。这是否可取取决于他们对收藏品的处理方式。
锁定对象不会影响将对象用于同步以外的任何目的。
关于c# - 使用现有对象而不是创建特定的锁定对象安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8209223/