最初の(怠zyな男、スレッドは安全ではない):
パブリッククラスのシングルトン{プライベートスタイントンインスタンス; {} public static getInstance(){instance == null){inston();}
この書き方は明らかですが、致命的なことは、マルチスレッドでは通常機能できないということです。
2番目のタイプ(怠zyな男、スレッドの安全性):
パブリッククラスのシングルトン{プライベートスタイントインスタンス;
この執筆方法は、マルチスレッドでうまく機能します。また、残念ながら、効率は非常に低く、99%を同期する必要はありません。
3番目(空腹の男):
パブリッククラスのsingleton {private static singlet instance = new Singlet();
この方法は、マルチスレッドの同期の問題を回避するためのクラスローダーメカニズムに基づいていますが、この時点ではクラスの負荷が発生していることは明らかになりません。読み込み。
4番目のタイプ(空腹の男、バリアント):
パブリッククラスシングルトン{static = new singlet();
表面的には、3番目の方法、つまりインスタンスのインスタンスが非常に異なります。
5番目(静的内部クラス):
パブリッククラスのシングルトン{プライベートスタティッククラスシングル{プライベートスタティックファイナルシングレットインスタンス= new Singleton();} private singlet(){} public static l singleton getInstance(){return singletonholder.instance;}}}
また、この方法では、クラスロダーのメカニズムを使用して、初期化されたインスタンスの場合に1つのスレッドのみがあることを確認します(非常に小さな違い)。ロードされると、インスタンスがインスタンス化され(怠zyな負荷効果が得られませんでした)、この方法はSingletonクラスがロードされ、インスタンスが初期化されない可能性があります。 Singletonholderクラスは積極的に使用されていないため、GetInstanceメソッドを呼び出してインスタンスを即座に呼び出すことによって表示される場合にのみSingletonholderクラスが表示されます。制度化されたインスタンスがリソースを消費している場合、私は彼に負荷を遅らせることを望んでいます。結果として使用するように使用するために、インスタンスインスタンスは明らかに不適切です。現時点では、この方法は3番目と4番目の方法に比べて非常に合理的です。
6番目のタイプ(列挙):
public enum singleton {instance;
この方法は、効果的な著者であるジョシュの特性に加わりました。
7番目(ダブルスクールロック):
パブリッククラスのシングルトン{プライベート揮発性静的シングルトンシングルトン(){} public static singletonleton(){if(singlen == null)izlet(singleton == null){singleton = new singleton() ;}}} return singleton;}}
これは、一般的に二重検査ロックとして知られている2番目の方法のアップグレードバージョンです。詳細を確認してください:http://www.ibm.com/developerworks/cn/java/j-dcl.html
JDK1.5の後、二重検査ロックは正常に特異効果を達成できます。
要約します
注意を払うべき2つの質問があります。
1.単一のケースが異なるタイプのローダーによってロードされている場合、複数のシングルケースインスタンスがある場合があります。たとえば、一部のサーブレットコンテナは、この方法で完全に異なるタイプのローダーを使用しているとします。
2. SingletonがJava.io.Serializableインターフェイスを実装している場合、このクラスのインスタンスがシリアル化され復元される場合があります。いずれにせよ、シングルクラスのオブジェクトをシリアル化してから複数のオブジェクトを復元すると、シングルケースクラスの複数の例があります。
最初の質問を修復する方法は次のとおりです。
プライベート静的クラスGetClass(StringClassName)
ClassNotFoundExceptionをスローします{
classloader classloader = thread.currentthread()。
if(classloader == null)
classloader = singleton.class.getClassLoader();
return(classloader.loadclass(className));
}
}
2番目の質問を修復する方法は次のとおりです
パブリッククラスのシングレットトンはjava.io.serializableを実装しています{
public static singleton instance = new Singleton();
保護されたsingleton(){
}
プライベートオブジェクトreadResolve(){
インスタンスを返す;
}
}
私にとっては、3番目と5番目の方法を好み、簡単に理解しやすく、JVMレイヤーのスレッドの安全性を実現します(マルチクラスのローダー環境ではない場合は、3番目の方法を使用します。 5番目の方法を使用して、怠zyなロード効果が明確に達成されている場合は、カウンターオーダーの作成オブジェクトを使用します他の特別なニーズがある場合は、第7メソッドを使用することはありません。
================================================ ==============
Superheizaiのクラスメートは非常によく要約しました:
ただし、一般に、最初の例は単一の例ではなく、4番目と3番目のタイプは計算されます。したがって、一般的なシングルは5つの執筆方法です。怠zyな男性、邪悪な男性、デュアルスクールロック、列挙、静的な内部クラス。
私はそのような読者を持っていて、彼らを一緒に励ましてとてもうれしいです。