c# - 使用现有对象而不是创建特定的锁定对象安全吗?

标签 c# multithreading locking thread-safety

编辑:事实证明,当我浏览时,我发现一个问题似乎与我之前没有发现的问题相同: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/

相关文章:

java - Android Studio Java ANR 内存泄漏

multithreading - GTK 和 nanomsg 的线程友好主循环

c - 字节数组中的原子设置位

java - 锁定Java中文件的存在

javascript - Active Bootstrap 选项卡在 DropDown SelectedIndexChanged 事件中丢失其索引?

c# - 为什么我可以将索引器应用于 VB.Net 中的 ICollection,但不能在 C# 中

c# - 如何知道变量是否包含整数或字符串?

iPhone:如何使用performSelector:onThread:withObject:waitUntilDone:方法?

c# - 从控制台应用程序返回数据

c++ - 防止代码死锁的锁定策略和技术