Hungry 모드는 클래스가 로드될 때 싱글톤 개체를 직접 생성하고 초기화하므로 스레드 안전 문제가 없습니다. ClassLoader 클래스 메커니즘을 사용하며 프로그램이 시작될 때 한 번만 로드되므로 스레드 안전 문제가 없습니다. 구현 코드는 다음과 같습니다.
public class Singleton { // 1.防止外部直接 new 对象破坏单例模式 private Singleton() {} // 2.通过私有变量保存单例对象 private static Singleton instance = new Singleton(); // 3.提供公共获取单例对象的方法 public static Singleton getInstance() { return instance; } }
장점: 간단한 구현, 스레드 안전 문제가 없습니다. 단점: 클래스가 로드될 때 객체가 생성됩니다. 생성 후 사용하지 않으면 리소스 낭비가 발생합니다.
게으른 모드와 배고픈 모드는 정확히 반대입니다. 소위 게으른 로딩(lazy loading)은 처음 사용할 때만 초기화된다는 의미입니다.
구현 코드는 다음과 같습니다.
public class Singleton { // 1.防止外部直接 new 对象破坏单例模式 private Singleton() {} // 2.通过私有变量保存单例对象 private static volatile Singleton instance = null; // 3.提供公共获取单例对象的方法 public static Singleton getInstance() { if (instance == null) { // 第一次效验 synchronized (Singleton.class) { if (instance == null) { // 第二次效验 instance = new Singleton(); } } } return instance; } }
lazy 모드는 스레드 안전성을 보장하기 위해 이중 검증 잠금과 휘발성을 사용합니다 위의 코드에서 볼 수 있듯이, Hungry 모드인지 Lazy 모드인지는 알 수 없습니다. 구현 단계는 동일합니다.
스레드 안전성과 지연 로딩을 모두 보장할 수 있습니다. 호출 시 ClassLoader 메커니즘을 통해 내부 정적 클래스만 로드하고 초기화하므로 스레드가 안전합니다. 이 모드의 구현 코드는 다음과 같습니다:
public class Singleton { // 1.防止外部直接 new 对象破坏单例模式 private Singleton() { } // 2.静态内部类 private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } // 3.提供公共获取单例对象的方法 public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }4. Enumeration
열거는 처음 사용될 때만 Java 가상 머신에 의해 로드 및 초기화되므로 스레드로부터 안전하며 게으릅니다. loading, 구현 코드는 다음과 같습니다.
public enum EnumSingleton { INSTANCE; public EnumSingleton getInstance(){ return INSTANCE; } }
위 내용은 Java 싱글톤 패턴의 구현 방법 및 일반적인 작성 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!