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 に答える