3

次のコードは、MS が新しい Security Token Service Web サイトを作成するために使用する (Windows Identity Foundation SDK) テンプレートから抜粋したものです。

public static CustomSecurityTokenServiceConfiguration Current  
{  
    get  
    {
        var key = CustomSecurityTokenServiceConfigurationKey;

        var httpAppState = HttpContext.Current.Application;

        var customConfiguration = httpAppState.Get(key)
            as CustomSecurityTokenServiceConfiguration;  

        if (customConfiguration == null)
        {  
            lock (syncRoot)
            {
                customConfiguration = httpAppState.Get(key)
                    as CustomSecurityTokenServiceConfiguration;  

                if (customConfiguration == null)
                {
                    customConfiguration =
                        new CustomSecurityTokenServiceConfiguration();  
                    httpAppState.Add(key, customConfiguration);
                }
            }
        }    
        return customConfiguration;  
    }
}

私はマルチスレッドプログラミングに比較的慣れていません。このステートメントの理由は、lock2 つの Web 要求が Web サイトに同時に到着した場合に、このコードをスレッドセーフにするためだと思います。

lock (syncRoot)ただし、このメソッドが動作している現在のインスタンスを参照しているため、使用は意味がないと思ってsyncRootいました...しかし、これは静的メソッドです!

これはどのように理にかなっていますか?

4

1 に答える 1

6

C#lockステートメントはメソッドをロックするのではなく、それが提供されるオブジェクトをロックします。あなたの場合syncRootsyncRootこのオブジェクトのインスタンスは 1 つしかないため、CustomSecurityTokenServiceConfigurationクラスはそのアプリ ドメインに対して 1 回だけ作成されます。そのため、プロパティを呼び出して並行して実行できます。ただし、 内のブロックlock { ... }が並列に呼び出されることはありません。ただし、複数回呼び出すことができます。これが、余分なif (customConfiguration == null)ステートメントがlockブロック内で行っていることです。このメカニズムは、二重チェック ロックと呼ばれます。

于 2010-05-18T15:22:54.733 に答える