Webアプリケーションで変更可のstatic変数はスレッドセーフにしておくべきらしい

スポンサーリンク

「static」「スレッドセーフ」のキーワードで検索しているとタイトルのようなことに気付いたのでまとめておきます。

気付いたことは、複数のユーザーがログインして利用するようなWebアプリケーションで、変更が加わる可能性のあるstatic変数はスレッドセーフにしておくべきことです。

そもそも私はスレッドセーフやstaticについてもよく分かっていない状態で、スレッド(ユーザー)をまたいで1つのインスタンスや変数を共有するなんてことはないと思っていました。

まず、staticについて、staticクラスやメソッドはそのstaticクラスやメソッドが参照されるプログラムが読み込まれるときに読み込まれるようです。

静的クラスと静的クラス メンバー - C# プログラミング ガイド
静的クラスは、C# ではインスタンス化できません。 静的クラスのメンバーにアクセスするには、クラス名自体を使用します。

そして、複数のユーザーがログインして利用するようなWebアプリケーションではみんなが同一のプログラムを利用している状態なので、static変数が共有されてしまいます。

ASP.NET Webアプリケーションで、ユーザー情報はstatic変数ではなくてSession変数を使うこと
ASP.NET Webアプリケーションでは、ユーザー固有の変数は、staticではなくて、Session変数で保存すべきです。static変数を使うのは、とても注意が必要です。理由は次の通りです。Webアプリケーションでstatic変数を使

なので、変更可のstatic変数はスレッドセーフにしておく必要があります。

ただし、変更可でないstatic変数はスレッドセーフにする必要はないようです。

Dictionaryは読み込みに対してはスレッドセーフでしょうか?
c#で最初にDictionaryに要素を追加し、その後複数のスレッドから読み込む処理があります。 Dictionaryの初期化処理はasp.netのInitPageで行います。 この場合、読み込み処理でマルチスレッドのため、問題になることは...

コメント

タイトルとURLをコピーしました