>  기사  >  Java  >  Java 싱글톤 패턴의 예에 대한 자세한 설명

Java 싱글톤 패턴의 예에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-16 10:34:261134검색

이 글은 Java 싱글턴 모드의 예시에 대한 자세한 설명에 대한 관련 정보를 주로 소개합니다. 이 부분을 완전히 이해하고 익히는 데 도움이 되기를 바랍니다. java 싱글턴 모드

개념:

싱글턴 패턴은 Java의 일반적인 디자인 패턴으로 게으른 스타일 싱글턴, 배고픈 스타일 싱글턴, 등록 스타일 싱글턴의 세 가지 유형이 있습니다. ​

싱글턴 패턴의 특징은 다음과 같습니다.

​ 1. 싱글턴 클래스는 하나의 인스턴스만 가질 수 있습니다.
 2. 싱글톤 클래스는 고유한 인스턴스를 생성해야 합니다.

 3. 싱글톤 클래스는 이 인스턴스를 다른 모든 객체에 제공해야 합니다.



싱글톤 패턴은 클래스에 인스턴스가 하나만 있도록 보장하고 자체적으로 인스턴스화하며 이 인스턴스를 전체 시스템에 제공합니다. 컴퓨터 시스템에서 스레드 풀, 캐시, 로그 개체, 대화 상자, 프린터 및 그래픽 카드 드라이버 개체는 종종 싱글톤으로 설계됩니다. 이러한 응용 프로그램은 모두 리소스 관리자의 기능을 어느 정도 갖추고 있습니다. 각 컴퓨터에는 여러 대의 프린터가 있을 수 있지만 두 개의 인쇄 작업이 동시에 프린터로 출력되는 것을 방지하기 위해 프린터 스풀러는 하나만 있을 수 있습니다. 각 컴퓨터에는 여러 개의 통신 포트가 있을 수 있으며, 하나의 통신 포트가 동시에 두 개의 요청에 의해 호출되는 것을 방지하기 위해 시스템은 이러한 통신 포트를 중앙에서 관리해야 합니다. 간단히 말해서, 싱글톤 모드를 선택하는 목적은 일관성 없는 상태를 피하고 장기적인 정책을 피하는 것입니다.

먼저 클래식 싱글톤 구현을 살펴보세요.

public class Singleton {
  private static Singleton uniqueInstance = null;

  private Singleton() {
    // Exists only to defeat instantiation.
  }

  public static Singleton getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
  // Other methods...
}

Singleton은 생성자를 비공개로 제한하여 클래스가 외부에서 인스턴스화되는 것을 방지합니다. 동일한 가상 머신 범위 내에서 Singleton의 유일한 인스턴스는 getInstance() 메서드를 통해서만 액세스할 수 있습니다. (실제로 Java 리플렉션 메커니즘을 통해 전용 생성자로 클래스를 인스턴스화하는 것이 가능하며, 이는 기본적으로 모든 Java 싱글톤 구현을 무효화합니다. 이 문제는 여기서 논의하지 않습니다. 리플렉션 메커니즘이 존재하지 않는다고 가정하겠습니다. )

그러나 위의 구현은 스레드 안전 문제를 고려하지 않습니다. 소위 스레드 안전이란 코드가 있는 프로세스에서 동시에 실행 중인 여러 스레드가 있는 경우 이러한 스레드가 이 코드를 동시에 실행할 수 있음을 의미합니다. 각 실행의 결과가 단일 스레드 실행의 결과와 동일하고 다른 변수의 값도 예상과 동일하면 스레드로부터 안전합니다. 즉, 클래스나 프로그램에서 제공하는 인터페이스는 스레드에 대한 원자적 작업이거나 여러 스레드 간의 전환으로 인해 인터페이스의 실행 결과에 모호성이 발생하지 않으므로 동기화 문제를 고려할 필요가 없습니다. 분명히 위의 구현은 스레드 안전성 요구 사항을 충족하지 않으며 여러 Singleton 인스턴스가 동시 환경에 나타날 가능성이 높습니다.

public class TestStream {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  } 
  //该类只能有一个实例
  private TestStream(){}  //私有无参构造方法
  //该类必须自行创建
  //有2种方式
  /*private static final TestStream ts=new TestStream();*/
  private static TestStream ts1=null;
  //这个类必须自动向整个系统提供这个实例对象
  public static TestStream getTest(){
    if(ts1==null){
      ts1=new TestStream();
    }
    return ts1;
  }
  public void getInfo(){
    System.out.println("output message "+name);
  }
}
/**
 * 
 */
public class TestMain {
  public static void main(String [] args){
    TestStream s=TestStream.getTest();
    s.setName("张孝祥");
    System.out.println(s.getName());
    TestStream s1=TestStream.getTest();
    s1.setName("张孝祥");
    System.out.println(s1.getName());
    s.getInfo();
    s1.getInfo();
    if(s==s1){
      System.out.println("创建的是同一个实例");
    }else if(s!=s1){
      System.out.println("创建的不是同一个实例");
    }else{
      System.out.println("application error");
    }
  }
}

작업 결과:

张孝祥
张孝祥
output message 张孝祥
output message 张孝祥
创建的是同一个实例


결론

: 결과에서 우리는 싱글턴 패턴이 어떤 기능이든 객체에 대한 유일한 액세스 지점을 가진 객체 지향 애플리케이션을 제공한다는 것을 알 수 있습니다. 구현하면 전체 응용 프로그램이 모두 인스턴스 개체를 공유합니다.

1. 배고픈 싱글턴 클래스

//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
  //私有的默认构造子
  private Singleton1() {}
  //已经自行实例化 
  private static final Singleton1 single = new Singleton1();
  //静态工厂方法 
  public static Singleton1 getInstance() {
    return single;
  }
}


2. 게으른 스타일의 싱글턴 클래스

//懒汉式单例类.在第一次调用的时候实例化 
public class Singleton2 {
  //私有的默认构造子
  private Singleton2() {}
  //注意,这里没有final  
  private static Singleton2 single=null;
  //静态工厂方法 
  public synchronized static Singleton2 getInstance() {
     if (single == null) { 
       single = new Singleton2();
     } 
    return single;
  }
}


3. 으아악

위 내용은 Java 싱글톤 패턴의 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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