>  기사  >  Java  >  자바 싱글턴 패턴을 작성하는 방법

자바 싱글턴 패턴을 작성하는 방법

(*-*)浩
(*-*)浩원래의
2019-05-22 10:53:0810189검색

싱글턴 패턴은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.