ホルダー イディオムまたはダブル チェック ロックのいずれかを使用してシングルトンを実装するが、'getInstance()' を呼び出す代わりに、リフレクションを使用してインスタンス化し、それに対して 'getInstance()' を呼び出すと、2 つのインスタンスが作成され、パターンが壊れます。 .
そのため、静的な「カウンター」メンバーをクラスに追加し、クラスのプライベート コンストラクターでインクリメントし、「1」を超えた場合は例外をスローします。しかし、その場合、最初にリフレクションを介してインスタンス化すると、誰も例外をスローせずに「getInstance()」を呼び出すことができなくなります。
では、シングルトンを遅延ロードしながら、この攻撃を防ぐにはどうすればよいでしょうか? (私は「列挙型」パターンを知っていますが、実際にはハックだと感じる人もいます。これの受け入れられた回答に関するコメントを確認してください:このシングルトンはシリアライゼーション攻撃とリフレクション攻撃の両方に耐性がありますか?ところで、私の質問は異なります)。
編集:DCLの場合、静的カウンターフィールド、クラスベースの同期コンストラクターを使用し、静的メンバーに「this」を割り当てることで、それを防ぐことができると思います。ただし、所有者のイディオムの場合、それを防ぐ方法がわかりません。