2

ホルダー イディオムまたはダブル チェック ロックのいずれかを使用してシングルトンを実装するが、'getInstance()' を呼び出す代わりに、リフレクションを使用してインスタンス化し、それに対して 'getInstance()' を呼び出すと、2 つのインスタンスが作成され、パターンが壊れます。 .

そのため、静的な「カウンター」メンバーをクラスに追加し、クラスのプライベート コンストラクターでインクリメントし、「1」を超えた場合は例外をスローします。しかし、その場合、最初にリフレクションを介してインスタンス化すると、誰も例外をスローせずに「getInstance()」を呼び出すことができなくなります。

では、シングルトンを遅延ロードしながら、この攻撃を防ぐにはどうすればよいでしょうか? (私は「列挙型」パターンを知っていますが、実際にはハックだと感じる人もいます。これの受け入れられた回答に関するコメントを確認してください:このシングルトンはシリアライゼーション攻撃とリフレクション攻撃の両方に耐性がありますか?ところで、私の質問は異なります)。

編集:DCLの場合、静的カウンターフィールド、クラスベースの同期コンストラクターを使用し、静的メンバーに「this」を割り当てることで、それを防ぐことができると思います。ただし、所有者のイディオムの場合、それを防ぐ方法がわかりません。

4

1 に答える 1

0

個人的には Enums にこだわりますが、Initialization on Demand Holder (IODH) イディオムもあります。

static class SingletonHolder {
  static Singleton instance = new Singleton();    
}

public static Singleton getInstance() {
  return SingletonHolder.instance;
}

これはEffective Java (item 48)に出てきますが、最初に聞いたのはcrazy bobの投稿でした

http://blog.crazybob.org/2007/01/lazy-loading-singletons.html

多くの興味深い議論については、http: //www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl を参照してください。

于 2012-04-13T09:42:41.883 に答える