2012-01-10 8 views
3

「シングルトン」は、「共有インスタンスが1つの通常の」オブジェクトとは異なり、「HttpContext.Currentのような単一のインスタンスとして表示されるオブジェクト」という珍しい意味で使用されています。この「シングルトン」はASP.NETアプリケーションでスレッドセーフであるべきですか?

私のasp.net MVCアプリケーションには、UserContextクラスのシングルトンタイプを使用しています。このクラスを使用すると、強く型付けされたセッションオブジェクトとしてユーザーデータを格納できます。私はthis CodeReview questionを見つけ、このアプリケーションのコンテキストでスレッドの安全性を心配する必要があるかどうか疑問に思った。

は、ここに私のコードの簡素化です:

public class UserContext 
{ 
    private UserContext() 
    { 
    } 

    public static UserContext Current 
    { 
     get 
     { 
      if (HttpContext.Current.Session["UserContext"] == null) 
       BuildUserContext(); 

      return (UserContext)HttpContext.Current.Session["UserContext"]; 
     } 
    } 

    private static void BuildUserContext() 
    { 
     if (!user.Identity.IsAuthenticated) return; 

     var uc = new UserContext { IsAuthenticated = true }; 

     // ...snip... 
     // Set up user data 

     // Save it into the session 
     HttpContext.Current.Session["UserContext"] = uc; 
    } 


    #region Class members 
    public bool IsAuthenticated { get; internal set; } 
    public string Name { get; internal set; } 
    // ...snip... 
    // Other properties 

    public void Refresh() 
    { 
     BuildUserContext(); 
    } 

    public void Flush() 
    { 
     HttpContext.Current.Session["UserContext"] = null; 
    } 
    #endregion 
} 

私がこれまでの任意のロックの問題を持っていなかったが、今のサイトは非常に高いトラフィックではありません。私はJon Skeetのスレッドセーフなモデルを採用すべきですか、それともIISが私のために管理していますか?

+0

サンプルに「シングルトン」はありますか?コードは合理的ですが、通常の意味ではオブジェクトは「シングルトン」ではありません(インスタンスが1つのオブジェクト - http://en.wikipedia.org/wiki/Singleton_pattern)...実際にシングルトンとして使用されると大きな問題になります。 –

+0

ええ、実際にタイトルに「シングルトン」という単語を含める前に一時停止しましたが、それをより効率的に記述する方法はありませんでした。セッションの文脈の中ではシングルトンですが、そうです、それはアプリケーション全体のシングルトンではありません。私の質問は、スレッディングがどのように処理されるか、そしてこれが問題を引き起こすかどうかについてです。 –

答えて

2

Sessionにアクセスするには既にスレッドセーフです。

一般に、スレッドセーフな方法で静的プロパティの共有状態にアクセスする限り、問題は発生しません。

1

ASPセッション状態には同期ロジックが付属しています。 実行されたページがセッション状態への書き込みアクセスを必要とする場合、セッション状態はロックされ、同じセッション上の他の要求は最初のセッションが終了するまで待たなければなりません。

Synchronizing Access to the Session Stateを参照してください。

関連する問題