2

シングルトンがシングルトンでない場合について説明したブログを読んでいました。

著者が説明しようとしているケースの 1 つは、Singleton に実装されている場合にダブル チェック ロックが失敗する可能性があることを示しています。

// Double-checked locking -- don't use
public static MySingleton getInstance() {
    if (_instance==null) {
      synchronized (MySingleton.class) {
        if (_instance==null) {
           _instance = new MySingleton();
        }
      }
    }
}

上記のコード ブロックについて、著者は次のように述べています。

「この状況では、メソッドが呼び出されるたびにシングルトン クラスのロックを取得する費用を回避するつもりです。ロックは、シングルトン インスタンスが存在しない場合にのみ取得され、インスタンスの存在が再度チェックされます。別のスレッドが現在のスレッドの直前に最初のチェックに合格した場合。」

誰かがこれが何を意味するのかを説明するのを手伝ってもらえますか?

4

3 に答える 3

4

話してみます。

ブロックはクロススレッドのsynchronized調整が必要なため、入力に時間がかかります。必要に応じて入力しないようにします。

ここで、複数のスレッドで作業している場合、オブジェクトが既に存在する場合は、メソッドがスレッドの競合状態に対して内部的に同期するため、オブジェクトを返すだけにしましょう。同期されたブロックに入る前に、作成されたかのようにこれを行うことができます。コンストラクターは既に設計されているため、メモリ モデルの設計で指定されているように、部分的に構築されたオブジェクトを返すことはできません。

シングルトン オブジェクトがまだ存在しない場合は、作成する必要があります。しかし、チェック中に別のスレッドが作成された場合はどうでしょうか? synchronized他のスレッドがそれを保持していないことを確認するために使用します。さて、入ったらまたチェック。シングルトンが別のスレッドによって作成された場合は、既に存在するため、それを返しましょう。これを行わなければ、スレッドはそのシングルトンを取得して何かを行うことができ、その変更と効果を処理するだけです。

そうでない場合は、ロックして新しいものを返しましょう。ロックを保持することで、シングルトンを反対側から保護します。別のスレッドがロックを待機し、(内部の null 比較に従って) 作成されたことに気付くと、既存のスレッドが返されます。ロックを取得しなかった場合、スレッドは変更を処理するだけでなく、変更が破棄されていることもわかります。あなたの投稿のコード ブロックは不完全であることに注意してください。_instancenull チェックのいずれかが返された場合はfalse、else ブロックを使用して返す必要があります。

シングルスレッド環境であれば、これは重要ではありませんでした。次のように使用できます。

public static MySingleton getInstance() {
    if (_instance==null) {
        _instance = new MySingleton();
    }
    else return _instance;
}

新しいバージョンでは、Java は多くの場合、ライブラリの一部としてこの動作を使用し、時間をかけて取得する前にロックが必要かどうかを確認します。以前は、ロックの取得に失敗した (不良、データ損失) か、すぐに取得できました (不良、速度低下とデッドロックの可能性が高くなります)。

スレッド セーフのために、独自のクラスにこれを実装する必要があります。

于 2013-06-30T01:28:45.033 に答える
3

彼はその引用でそれがどのように失敗するかを説明していません. 彼はダブルチェックロックについて説明しているだけです。彼はおそらく別の場所で、Java 1.5 より前ではダブルチェック ロック自体が機能しなかったという事実に言及しています。しかし、それはずっと前のことです。

于 2013-06-30T01:28:23.123 に答える
1

ウィキペディアで、さまざまなシングルトンの実装、それらの欠陥、および何が最善かについての最良の説明を見つけました。このリンクに従ってください:

http://en.wikipedia.org/wiki/Singleton_pattern

それが役に立てば幸い!

于 2013-06-30T01:28:32.797 に答える