シングルトンモード
シングルトンパターンの要点
シングルトンモードは作成モードに属します
3つの主なポイント:
- クラスのインスタンスは1つだけ存在できます
- このインスタンスを自分で作成する必要があります
- このインスタンスをシステム全体に独自に提供する必要があります
シングルトンモードの特徴
- シングルトンクラスは1つのインスタンスしか持つことができません
- シングルトンクラスは、独自の一意のインスタンスを作成する必要があります
- シングルトンクラスは、このインスタンスを他のすべてのオブジェクトに提供する必要があります
空腹の中国のシングルトン
スレッドセーフで実装が簡単
長所:ロックがなく、実行効率が高い
短所:クラスがロードされると初期化されるため、メモリが浪費されます
public class Singleton {
private final static Singleton SINGLETON = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return SINGLETON;
}
}
別の実装:
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
怠惰なシングルトン
1つ:怠惰な男、スレッドは安全ではありません
実装が簡単で
、ロックがなく、マルチスレッドの状況では安全ではありません
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2:怠惰な男、スレッドセーフ
実装が簡単で、スレッドセーフです。
長所:初めて呼び出されたときにのみ初期化して、メモリ消費を回避します。
短所:synchronizedキーワードが追加され、非効率的です。
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3:怠惰なスタイル、スレッドは安全ではありません
実装は簡単で
、シングルトンを作成するのは安全ではありません
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
4:レイジースタイル、ダブルチェックロック/ダブルチェックロック
JDK1.5以降、
スレッドセーフ、実装はより複雑になります。
利点:スレッドセーフ、遅延読み込み、高効率。
注:揮発性キーワードの変更は重要です。
public class Singleton {
private static volatile Singleton instance;
private Singleton () {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
5:怠惰で静的な内部クラス
利点:スレッドセーフ、遅延読み込み、高効率
原理:クラスの静的プロパティは、クラスが初めて読み込まれるときにのみ初期化されます。ここで、JVMはスレッドの安全性を確保するのに役立ちます。クラスが初期化されると、他のスレッドは入ることができません。
public class Singleton {
private Singleton() {
}
private static class LazySingletonInstance {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return LazySingletonInstance.instance;
}
}
6:怠惰な男、列挙
JDK1.5以降、
スレッドセーフと簡単な実装
利点:より簡潔で自動シリアル化メカニズムがサポートされ、複数のインスタンス化が完全に防止されます
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
総括する
一般的に、1番目、2番目、3番目の方法を使用することはお勧めしません。空腹の人の方法を使用することをお勧めします。5番目の静的内部クラスメソッドは、遅延読み込み効果を明確に実現する場合にのみ使用されます。オブジェクトを作成するために逆シリアル化が必要な場合は、6番目の列挙方法を試すことができます。他に特別なニーズがある場合は、4番目のダブルチェックロック方法の使用を検討できます。