0

私はデザインパターンを調べていて、シングルトンパターンに出くわしました

class SingletonPattern implements Runnable {
    private static SingletonPattern single=null;

    private SingletonPattern() { }

    public synchronized static SingletonPattern getInstance() {
        if(null==single) {
            single=new SingletonPattern();
        }
        return single;
    }
}

これで、同期が 2 つのスレッドが getInstance メソッドにアクセスできないことを理解しましたが、間違っている場合は修正してください。したがって、2 つのオブジェクトを持つことができます。

4

4 に答える 4

2

いいえ。同期メソッドは、2 つのスレッドが同時にメソッドを呼び出すことを防ぎます。Synchronized hereについて読むことができます。メソッドの場合static、同期はオブジェクトではなくクラスに作用します。

ただし、このシングルトンの作成方法は非効率的です。また、ダブル チェック ロックが壊れています。Java でシングルトンを実行する最善の方法は、Enumを使用することです

于 2013-07-20T07:57:34.490 に答える
0

変数 single は静的です。つまり、クラス SingletonPattern のすべてのインスタンスは、同じ変数 single を共有します。関数 getInstance() が初めて実行されるとき、変数 single は null であるため、

single = new SingletonPattern();

これにより、変数 single が null ではなくなります。

次に、関数 getInstance() のすべての連続呼び出しは if 句に入らず、クラス SingletonPattern の同じインスタンスへの参照である同じ変数 single のみを返します。

また、synchronized キーワードは、関数 getINstance() が 2 つのスレッドで同時に呼び出されないようにします。

于 2013-07-20T08:01:21.320 に答える
0

いいえ。getInstancesingleは静的であるため、両方のスレッドがまったく同じメソッドとオブジェクトを使用するため、2 つのオブジェクトは存在しません。synchronized内部に同時にアクセスしないようにしますgetInstance

于 2013-07-20T08:03:24.843 に答える
0

同期された静的メソッドはクラス ロックを取得し、このクラスのすべてのオブジェクトに対して使用できる単一のクラス ロックがあります。したがって、異なるオブジェクトが同時にこのロックを取得することはできません。

ただし、このメカニズムは、別のクラスローダが関与していない限り機能します。

Javaでシングルトンを実装する最良の方法は、列挙型を使用することですが

于 2013-07-20T08:04:03.720 に答える