私のアプリケーションには、複数のスレッドから同時に呼び出される静的メソッドがあります。データが混同される危険性はありますか?
最初の試みでは、メソッドは静的ではなく、クラスの複数のインスタンスを作成していました。その場合、私のデータはどういうわけか混乱しました。たまにしか発生しないため、これがどのように発生するかはわかりません。まだデバッグ中です。しかし今、メソッドは静的です。今のところ問題はありません。多分それは運だけです。よくわかりません。
私のアプリケーションには、複数のスレッドから同時に呼び出される静的メソッドがあります。データが混同される危険性はありますか?
最初の試みでは、メソッドは静的ではなく、クラスの複数のインスタンスを作成していました。その場合、私のデータはどういうわけか混乱しました。たまにしか発生しないため、これがどのように発生するかはわかりません。まだデバッグ中です。しかし今、メソッドは静的です。今のところ問題はありません。多分それは運だけです。よくわかりません。
回答:
メソッド内で宣言された変数(「キャプチャされた」変数を除く)は分離されているため、固有の問題は発生しません。ただし、静的メソッドが共有状態にアクセスする場合、すべてのベットはオフになります。
共有状態の例は次のとおりです。
状態を共有している場合は、次のいずれかを行う必要があります。
whatever.SomeData
、繰り返し参照するのではなく、ローカル変数にwhatever.SomeData
1回読み込んでから、変数を使用してください-これは不変の状態でのみ役立つことに注意してください!)はい、それは運です。;)
メソッドが静的かどうかは関係ありません。重要なのは、データが静的かどうかです。
各スレッドが独自のデータセットを持つ独自のクラスの個別のインスタンスを持つ場合、データが混同されるリスクはありません。データが静的である場合、データのセットは1つだけであり、すべてのスレッドが同じデータを共有するため、データを混同しないようにする方法はありません。
別々のインスタンスのデータがまだ混同されている場合、それはおそらくデータが実際には分離されていないためです。
It doesn't matter if the method is static or not, what matters is if the data is static or not
。追加するだけで、静的メソッドのスコープ内で宣言されたローカル変数は、特定のシナリオで問題になるデータのその部分を形成しません。
静的メソッドは、複数のスレッドに適しています。
一方、静的データは、異なるスレッドから同じデータにアクセスする試みを制御して、一度に1つのスレッドのみがデータの読み取りまたは書き込みを行うようにする必要があるため、問題を引き起こす可能性があります。
MSDNは常に言う:
この型のすべてのpublic static(Visual BasicではShared)メンバーはスレッドセーフです。インスタンスメンバーは、スレッドセーフであるとは限りません。
編集:ここの連中が言うように、常にそうであるとは限らず、明らかにこれはBCLでこのように設計されたクラスに適用され、これが適用されないユーザー作成クラスには適用されません。