锁定私有对象或hashset本身?

时间:2013-05-20 20:55:09

标签: c# locking

假设我有下面的哈希集

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

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

我可以用这两种方式锁定它有什么性能差异吗?

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

lock(hsWaitingToBeFetched)
{
// do stuff here
}

1 个答案:

答案 0 :(得分:3)

没有性能差异 1 .. 如果某些其他代码也锁定在HashSet上,则语义差异将是露出。

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

  1. 更清晰的意图 - 取决于场景
  2. 可以隐藏锁定对象(私有)但是暴露HashSet 这应该在没有非常仔细考虑的情况下被忽略 - 仅锁定(私有)更新(公共)HashSet不是正确同步。
  3. 如果类型锁定自身,请避免意外
  4. 即使重新分配HashSet成员也可以使用
  5. 但是,因为单独的锁定对象没有锁定HashSet,如果其他东西需要它,那么它就会...


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