2016-12-26 8 views
0

私は静的変数を知っているか、スレッド間でコレクションが共有されていますが、多くても単一のメモリアドレスが変数用に作成され、ステートはスレッド間で永続的になります。静的リストまたは変数にロック機構が必要ですか?

静的INTカウント= 0

スレッド1 - >カウント++

スレッド2 - > diplayカウント - > 1

スレッド3 - > count--

スレッド1 - 表示回数 - > 0

私の質問は、静的なコレクションのロック機構が必要ですか?以下は静的な収集とロック機構です。

public static List<ConnectionManager> ServerConnections = new List<ConnectionManager>(); 
lock (Global.ServerConnections) 
{ 
//do something 
} 

答えて

0

答えは:はい。 Static!= Thread safeなので、ロックが必要です。これはあなたのcount変数にも当てはまります。

単に変数がスレッドセーフではない静的なためです。同時に複数のスレッドが同時にアクセスすることができるため、並行性の問題が発生します。

デフォルトではスレッドの安全性は何もありません。スレッドセーフであるように設計する必要があります。

ConcurrentBag<T>もご覧ください。

0

スレッドの安全性だけが必要な場合は、C#並行コレクションを使用できますが、(あるスレッド内のコレクションにいくつかのアクションを実行して他のスレッドに影響を与えずに実行するなど)同期が必要な場合は、ロックが必要です。

実際には、変数も考慮する必要があります。count++count--はスレッドセーフではありません。スレッドの安全性を確保するには、Interlockedまたはその他のメカニズムを使用してください。

0

コレクションをどのように使用するか、それをどのように導入するかに属します。異なるスレッドからインスタンス化する場合は、ただ1つのスレッドしかインスタンス化していないことを保証する必要があります。悪いと多くのスレッドが同時にinstatiationを試すので。 .Netに実装されているLazyクラスは、この目的のためのものであり、スレッドセーフとレイジーのインスタンス化を容易にします。あなたがしたい操作のいかなる場合でもあなたのコレクションをロックする必要があります。挿入、削除、反復などはすべてスレッドセーフではありません。スレッドセーフなコレクションの詳細については、concurrentDictionaryなどを参照してください。

関連する問題