0

假设我有下面的哈希集

   HashSet<string> hsWaitingToBeFetched = new HashSet<string>();

现在我正在做多线程编程,所以我必须锁定它才能同步对象

我可以用两种方式锁定它有任何性能差异吗?

private Object lockHashset = new Object();
lock(lockHashset)
{
// do stuff here
}

或者

lock(hsWaitingToBeFetched)
{
// do stuff here
}
4

1 回答 1

3

不会有性能差异1 ..语义差异将是如果其他代码在 HashSet 公开时也锁定它。

我认为在这种情况下使用单独的锁定对象更清楚:

  1. 更清晰的意图 - 取决于场景
  2. 可以隐藏锁定对象(私有)但暴露 HashSet如果没有非常仔细的考虑,这应该被忽略- 仅用于(私有)更新(公共)HashSet 的锁定未正确同步。
  3. 如果类型锁定自身,请避免意外
  4. 即使重新分配 HashSet 成员也可用

但是,因为单独的锁定对象不会锁定 HashSet,如果其他东西期望它会锁定 ..


1新的锁对象创建成本可忽略。对于所描述的两种情况,CLR 以相同的方式进入监视器。

于 2013-05-20T20:57:35.203 回答