2

以下のコード セグメントで、ロック方法に違いはありますか?

public Hashtable mySet= new Hashtable() //mySet is visible to other threads.
lock (mySet) 
   { 
       mySet.Add("Hello World"); 
   } 

public Hashtable mySet= new Hashtable();
lock(mySet.SyncRoot)
    { 
       mySet.Add("Hello World"); 
    }
4

3 に答える 3

2

へのオブジェクトパスエンドlockは「フラグホルダー」としてのみ使用されるため、これによる違いはありません。

こちらをご覧ください

于 2012-07-03T16:49:45.537 に答える
2

lock問題のオブジェクトを実際にロックするわけではないので、どのオブジェクトが使用されても違いはありません。代わりに、オブジェクトを使用してプロトコルを確立し、すべてのスレッドが同じオブジェクトを使用する限り、プロトコルは、そのロックによって保護されたコードを 1 つのスレッドだけが実行することを保証します。

オブジェクトは、トーク ショーのマイクと考えることができます。マイクを持っている人だけが話すことができます (一部のショーでは常にそうであるとは限りませんが、とにかくそれがアイデアです)。

于 2012-07-03T16:54:12.413 に答える
1

ここの MSDN ドキュメントによると、コレクションの SyncRoot のロックのみがスレッド セーフを保証します。

コレクションの列挙は、本質的にスレッドセーフな手順ではありません。コレクションが同期されている場合でも、他のスレッドがコレクションを変更できるため、列挙子は例外をスローします。列挙中のスレッド セーフを保証するには、列挙全体でコレクションをロックするか、他のスレッドによる変更に起因する例外をキャッチします。

于 2012-07-03T16:58:47.090 に答える