gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:06:09 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com