싱글턴 패턴은 Java에서 가장 간단한 디자인 패턴 중 하나입니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.
이 패턴에는 단일 객체만 생성되도록 하면서 자체 객체 생성을 담당하는 단일 클래스가 포함됩니다. 이 클래스는 클래스의 개체를 인스턴스화할 필요 없이 고유한 개체에 직접 액세스할 수 있는 방법을 제공합니다.
참고:
1. 싱글톤 클래스는 인스턴스를 하나만 가질 수 있습니다. 2. 싱글톤 클래스는 고유한 인스턴스를 생성해야 합니다. 3. 싱글톤 클래스는 이 인스턴스를 다른 모든 객체에 제공해야 합니다.
Java 싱글톤 모드를 작성하는 5가지 방법:
1. 지연 모드(lazy 모드)
// 饱汉 // UnThreadSafe public class Singleton1 { private static Singleton1 singleton = null; private Singleton1() { } public static Singleton1 getInstance() { if (singleton == null) { singleton = new Singleton1(); } return singleton; } }
장점: 지연 로딩이 빠르게 시작되고, 작은 리소스를 차지하며, 사용될 때 인스턴스화되고, 잠금이 없습니다.
단점: 스레드로부터 안전하지 않습니다.
2. 게으른 모드(lazy mode) - 스레드 안전성
public class Singleton { /** * 定义一个变量来存储创建好的类实例 */ private static Singleton uniqueInstance = null; /** * 私有化构造方法,好在内部控制创建实例的数目 */ private Singleton(){ } /** * 定义一个方法来为客户端提供类实例 * @return 一个Singleton的实例 */ public static synchronized Singleton getInstance(){ //判断存储实例的变量是否有值 if(uniqueInstance == null){ //如果没有,就创建一个类实例,并把值赋值给存储类实例的变量 uniqueInstance = new Singleton(); } //如果有值,那就直接使用 return uniqueInstance; } /** * 示意方法,单例可以有自己的操作 */ public void singletonOperation(){ //功能处理 } /** * 示意属性,单例可以有自己的属性 */ private String singletonData; /** * 示意方法,让外部通过这些方法来访问属性的值 * @return 属性的值 */ public String getSingletonData(){ return singletonData; } }
장점: 위와 동일하지만 잠겨 있습니다.
단점: 동기화는 배타적 잠금이며 동시성 성능이 좋지 않습니다. 생성이 성공한 후에도 인스턴스를 얻는 것은 여전히 직렬화된 작업입니다.
3. 레이지 모드(lazy mode) - Double Check Lock DCL (Double Check Lock)
public class Singleton { /** * 对保存实例的变量添加volatile的修饰 */ private volatile static Singleton instance = null; private Singleton(){ } public static Singleton getInstance(){ //先检查实例是否存在,如果不存在才进入下面的同步块 if(instance == null){ //同步块,线程安全的创建实例 synchronized(Singleton.class){ //再次检查实例是否存在,如果不存在才真的创建实例 if(instance == null){ instance = new Singleton(); } } } return instance; } }
장점: 레이지 로딩, 스레드 안전성.
참고: 완전한 초기화를 보장하려면 휘발성 키워드를 사용하여 인스턴스를 수정해야 합니다.
4. Hungry 모드
public class Singleton { //4:定义一个静态变量来存储创建好的类实例 //直接在这里创建类实例,只会创建一次 private static Singleton instance = new Singleton(); //1:私有化构造方法,好在内部控制创建实例的数目 private Singleton(){ } //2:定义一个方法来为客户端提供类实例 //3:这个方法需要定义成类方法,也就是要加static //这个方法里面就不需要控制代码了 public static Singleton getInstance(){ //5:直接使用已经创建好的实例 return instance; } }
장점: Hungry 모드는 본질적으로 스레드로부터 안전하며 사용할 때 지연이 없습니다.
단점: 시작 시 인스턴스가 생성되고, 시작이 느리며, 리소스 낭비가 발생할 수 있습니다.
5. 홀더 모드
public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ private static class SingletonHolder{ /** * 静态初始化器,由JVM来保证线程安全 */ private static Singleton instance = new Singleton(); } /** * 私有化构造方法 */ private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.instance; } }
장점: 지연 로딩과 스레드 안전성(잠금 없음)을 완벽하게 결합하는 방법입니다. (권장)
관련 학습 권장 사항: Java 기본 튜토리얼
위 내용은 자바 싱글턴 패턴을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!