对 Dictionary 的键使用锁定

2024-05-07

我有一个Dictionary<string, someobject>.

编辑:有人向我指出,我的例子很糟糕。我的全部意图不是更新循环中的引用,而是根据更新/获取数据的不同线程需要更新不同的值。我将循环更改为方法。

我需要更新字典中的项目 - 一次一个键,我想知道在我的 Dictionary 对象的 .key 值上使用锁是否存在任何问题?

private static Dictionary<string, MatrixElement> matrixElements = new Dictionary<string, MatrixElement>();

//Pseudo-code

public static void UpdateValue(string key)
{
    KeyValuePair<string, MatrixElement> keyValuePair = matrixElements[key];
    lock (keyValuePair.Key)
    {
        keyValuePair.Value  = SomeMeanMethod();
    }
}

这会在法庭上成立还是失败?我只是希望字典中的每个值独立锁定,因此锁定(和更新)一个值不会锁定其他值。我也知道锁定将保持很长一段时间 - 但数据将无效,直到完全更新。


锁定在代码之外可访问的对象锁定它是一个很大的风险。如果任何其他代码(任何地方)锁定了该对象,您可能会陷入一些难以调试的死锁。另请注意,您锁定了object,而不是引用,所以如果我给你一本字典,我可能仍然保留对键的引用并锁定它们 - 导致我们锁定同一个对象。

If您完全封装了字典,并自己生成密钥(它们从未被传入,那么您可能是安全的。

但是,请尝试坚持一条规则 - 尽可能限制锁定对象对锁定代码本身的可见性。

这就是为什么你会看到这个:

public class Something
{
  private readonly object lockObj = new object();

  public SomethingReentrant()
  {
    lock(lockObj)    // Line A
    {
      // ...
     }
   }
}

而不是看到上面的 A 行替换为

  lock(this)

这样,一个单独的对象就会被锁定,并且可见性受到限制。

Edit 乔恩·斯基特 https://stackoverflow.com/users/22656/jon-skeet正确地观察到上面的 lockObj 应该是只读的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 Dictionary 的键使用锁定 的相关文章

随机推荐