1

このイディオムがアンチパターンであると主張する共通の信念と複数の情報源 ( wikiを含む) があります。

  1. 正しい実装が使用されている場合 (たとえば、volatileを使用) 、製品コードでそれを使用することに反対する引数は何ですか?

  2. マルチスレッド環境で遅延初期化を実装するための適切な代替手段は何ですか? メソッド全体をロックすることはボトルネックになる可能性があり、最新の同期は比較的安価ですが、特に競合下では依然としてはるかに遅くなります。静的ホルダーは、言語固有で少し醜いハックのようです (少なくとも私にとっては)。Atomics ベースの実装は、従来の DCL とそれほど変わらないように見えますが、複数の計算が可能であったり、より複雑なコードが必要になったりします。たとえば、Scala はまだ遅延値を実装するために DCL を使用していますが、提案されている代替案ははるかに複雑に見えます。

4

1 に答える 1

-2

二重チェック ロックを使用しないでください。これまで。それは動作しません。それを機能させるためのハックを見つけようとしないでください。後の JRE には含まれていない可能性があるからです。

私の知る限り、オブジェクト全体をロック/同期する以外に、遅延初期化を保存する方法はありません。

synchronized (lock) {
  // lookup

  // lazy init
}

シングルトンの場合、静的ホルダー(@trashgodが述べたように)は便利ですが、複数のクラスローダーがある場合は単一のままではありません。

マルチクラスローダー環境で遅延シングルトンが必要な場合は、ServiceLoaderを使用してください。

于 2014-08-12T10:54:51.350 に答える