3

作業中のデータアクセスレイヤーには、次のようなシングルトンパブリックプロパティを介してクラスにアクセスするこの標準実装があります。

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

今、私はコードが何をしているかを理解していますが、クラスが使用されるたびにインスタンスを作成するだけでなく、なぜこれを行うのか疑問に思っていました.

4

3 に答える 3

2

編集:ああ、「データアクセスレイヤー」の部分をキャッチできませんでした。しかし、その例もあります。マルチスレッド アプリがそのすべてのデータベース呼び出しをシングルトン クラスに集中させる場合、一度に 1 つのスレッドだけがデータベースにアクセスし、競合状態を回避します。

すべての例外を吐き出し、情報を書き込むだけのマルチスレッド アプリケーションにロギング メカニズムがある場合 (特に、常に実行されているサービスやアプリの場合、何かが発生するたびにステータスを出力する場合)、ファイルに実行されます。 -ロックの問題。シングルトン ロガー クラスを使用して、1 つのスレッドのみがロガーにアクセスできるようにし、残りのスレッドは、ロガーが自由にテキスト ファイルに行を書き込めるようになるまで待機します。

シングルトンを使用するクールな理由はたくさんありますが、私もあなたと同じで、マルチスレッド アプリでのファイル アクセスに関するこの問題に遭遇するまで、シングルトンが何のためにあるのかわかりませんでした。

于 2008-10-31T01:04:40.643 に答える
1

あなたはこれもしたいかもしれません、そのダブルチェックされたロック、それはあなたのシングルトンへのアクセスをスピードアップします

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }
于 2008-10-31T01:32:50.870 に答える
1

答えは非常に簡単です。使用するたびに同じオブジェクトを取得する必要があるからです。

グローバル変数であることの利点 (つまり、1 つしかない) と、クラス オブジェクトであることの利点 (とりわけ、最初に必要なときに非表示の初期化を実行できる) が得られます。

于 2008-10-31T02:26:31.620 に答える