Javaのシングルトンパターンの実装方法は何ですか?
Javaでシングルトンパターンを実装する方法はいくつかあります:
- 饥饿加载(Eager Loading):クラスのロード時にシングルトンオブジェクトを作成し、静的メソッドを通じて返す。この方法はマルチスレッド環境下でも安全です。
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
- 呼び出し時にシングルトンオブジェクトを生成する様式で、この方法はマルチスレッド環境下ではスレッド同期処理が必要です。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 双重チェックロック:遅延初期化に改良を加え、インスタンス作成時に一度の空チェックを追加し、不要な同期コストを削減しました。
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 静的内部クラス:懒惰な読み込みを実現し、スレッドセーフを確保するために静的内部クラスの特性を利用します。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
- 列挙型:列挙型の特性を利用して、シングルトンパターンを実装します。列挙型はスレッドセーフで一度だけインスタンス化されます。
public enum Singleton {
INSTANCE;
// 需要添加的单例对象的其他方法
}