자바의 싱글 톤 클래스 – 싱글 톤 클래스를 사용하는 방법?



Java의 Singleton Class에 대한이 기사에서는 실용적인 구현과 함께 클래스를 Singleton으로 만들 수있는 다양한 방법에 대해 설명합니다.

Java에서 싱글 톤 클래스는 주어진 시간에 하나의 인스턴스 만 가질 수있는 클래스입니다. Java의 5 가지 Creational Design 패턴 중 하나입니다. . 이 기사의 매체를 통해 Java의 싱글 톤 클래스가 무엇이며 어떻게 생성 할 수 있는지에 대한 명확한 통찰력을 제공 할 것입니다.

다음은이 기사에서 다룰 주제입니다.





자바 경로를 변경하는 방법

시작하자.

Java의 싱글 톤 클래스는 무엇입니까?

평범한 용어로 Java의 Singleton 클래스는 한 번에 단일 인스턴스를 통해 액세스 할 수있는 클래스입니다. 이 디자인 패턴은 클래스의 불필요한 인스턴스화를 제한하고 JVM 인스턴스 당 언제든지 존재합니다. 따라서이 패턴을 사용하면 Singleton으로 정의 된 모든 클래스에는 단일 인스턴스 만 있습니다.글로벌 액세스 지점이 있습니다. 일반 클래스와 달리 싱글 톤 클래스는 애플리케이션 수명주기가 끝날 때까지 파괴되지 않습니다.



하지만 왜 우리는 처음에 싱글 톤 클래스가 필요합니까?

글쎄요, 클래스의 인스턴스 생성을 제한함으로써 메모리 공간을 절약 할 수 있습니다. 새로운 요청이있을 때마다 객체가 생성되지 않기 때문입니다. 대신 단일 개체가 반복적으로 사용됩니다. 이것이 Java의 Singleton 패턴이 주로 및 데이터베이스 응용 프로그램. 기본적으로 로깅, 캐싱, 스레드 풀링, 구성 설정 등에 사용됩니다..

Java의 Singleton 클래스 개념이 명확하기를 바랍니다. 이제이 부분에서 더 진행하겠습니다.Java 기사의 Singleton Class 및 생성 방법을 참조하십시오.



자바 싱글 톤 클래스를 디자인하는 방법

Java에서 클래스 싱글 톤을 만들려면 다음 세 가지가 필요합니다.

  1. 클래스의 정적 멤버
  2. 개인 생성자
  3. 정적 팩토리 방법

Java를 사용하면 개발자가 자신의 지평을 탐색 할 수 있으므로Singleton 클래스를 디자인 할 수있는 다양한 방법이 있습니다. 아래에 가장 인기있는 것을 나열했습니다.

  1. Eager 초기화 방법
  2. 지연 초기화 방법
  3. 스레드 안전 싱글 톤 방법
  4. 이중 잠금 방법을 사용한 지연 초기화
  5. 지연로드 방법
  6. 정적 블록 초기화 방법

이제 이러한 각 접근 방식을 하나씩 자세히 살펴 보겠습니다.

1. Eager 초기화 방법

이것은 클래스 로딩시 인스턴스가 생성되는 Singleton 클래스를 생성하는 가장 쉬운 방법입니다. 이 방법을 사용하여 싱글 톤 클래스를 만들려면 아래에 언급 된 단계를 따라야합니다.

  1. 생성자를 개인용으로 선언하십시오.
  2. 다음 단계는이 Singleton 클래스에 대한 개인 클래스 멤버를 만드는 것입니다.
  3. 이제 클래스 멤버의 인스턴스로 생성 한 클래스의 객체를 반환하는 데 사용할 팩토리 메서드를 정의해야합니다.
  4. 이 정적 인스턴스에 직접 액세스하려는 경우 정적 멤버를 public으로 선언 할 수도 있습니다.

이제이를 구현하는 방법을 살펴 보겠습니다.

// Eager Initialization public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

코드를 보면 우리가 사용하는 객체를 인스턴스화 할 때마다getInstance ()클래스를 호출하는 대신 메서드 건축업자 .그러나 자체 단점이 있습니다. 이 메서드를 사용하여 클래스 싱글 톤을 만들면 응용 프로그램이 사용하는지 여부에 관계없이 인스턴스가 생성됩니다.

이제 Java에서 싱글 톤 클래스를 만드는 다른 방법을 살펴 보겠습니다.

2. 지연 초기화 방법

이 메서드는 처음 사용할 때까지 클래스 인스턴스 생성을 연기하므로 지연 초기화라고합니다. 이 방법을 사용하면 필요한 경우에만 객체가 생성됩니다. 불필요한 생성을 방지하는 데 도움이됩니다. . 이런 방식으로 싱글 톤 클래스를 디자인하려면 아래 나열된 단계를 따라야합니다.

  1. 먼저 생성자를 개인용으로 선언하십시오.
  2. 그런 다음이 클래스에 대한 비공개 정적 인스턴스를 만들어야하지만 아직 인스턴스화 할 필요는 없습니다.
  3. 마지막으로 인스턴스 멤버가 null인지 여부를 먼저 확인하는 팩토리 메서드를 만듭니다. 그렇지 않으면 싱글 톤 클래스의 인스턴스를 생성하고 반환합니다.

아래 코드는 이것을 수행하는 방법을 보여줍니다.

// Lazy 초기화 public class LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synchronous (LazySingleton.class) {INSTANCE = new LazySingleton ()}} 반환 인스턴스}}

3. 스레드 안전 싱글 톤 방법

그러나 위의 접근 방식은 동시 시나리오에서 몇 가지 문제를 일으킬 수 있습니다. 싱글 톤 패턴은 주로 다중 스레드와 함께 사용되기 때문에여러 스레드가 동시에 if 조건을 입력하면 문제가 발생할 수 있습니다. 이를 방지하기 위해 전역 액세스 방법을 동기화하여 스레드로부터 안전한 싱글 톤 클래스를 만들려고합니다. 이렇게하면 어느 시점에서든 하나의 스레드 만이 메서드를 실행합니다. 구현을 보려면 아래 코드를 참조하십시오.

// Thread Safe Singleton public class ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public staticsynchronous ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

그러나 때때로이 접근 방식은 방법을 사용할 때마다 매우 번거로울 수 있습니다.메서드가 사용하기 전에 잠금이 해제 될 때까지 기다려야합니다. 그 결과 프로세스 속도가 느려지고 다음 접근 방식으로 이어집니다.이중 잠금을 사용한 지연 초기화.

4. 이중 잠금을 사용한 지연 초기화 방법

이 접근 방식에서는 메서드를 동기화하지 않습니다. 오히려 우리는 동기화 된 블록 내에 객체 생성 코드를 포함합니다.미리 스레드 잠금을 확인하면잠금 획득 횟수를 줄입니다. 이 접근 방식은 일반적으로 응용 프로그램의 성능을 향상시킵니다. 어떻게 수행되는지 아래 코드를 확인하십시오..

// Double Lock을 사용한 지연 초기화 public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {동기화 된 (LazyDoubleLockSingleton.class) {if (INSTANCE == null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. 지연로드 방법

이 방법은 JSL (Java Language Specification)을 기반으로하며 필요한 경우에만 정적 데이터 멤버를로드합니다. 따라서 싱글 톤 클래스가 JVM에로드 될 때 인스턴스가 생성되지 않습니다. 또한 프로그램을 실행하는 동안 전역 메서드가 순차적으로 호출됩니다. 이 메서드를 사용하면로드 및 초기화를 위해 정적 getInstance ()를 명시 적으로 동기화 할 필요가 없습니다. 정적 클래스 멤버는 적절한 시퀀스 방식으로 호출되며 글로벌 메서드의 나머지 동시 호출은 동기화 오버 헤드를 수행 할 필요없이 동일한 순서로 반환됩니다.

다음은 동일한 작업을 수행하는 코드입니다.

// Lazy Load Method public class LazyLoadSingleton {private LazyLoadSingleton () {} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. 정적 블록 초기화 방법

Java에서 싱글 톤 클래스를 만드는이 방법은 다음과 같습니다.eager 초기화 방법과 유사합니다. 유일한 차이점은이 클래스의 인스턴스는 기능.

// 정적 블록 초기화 public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // 정적 블록 내 예외 처리 static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ( 'Exception 발생 Singleton 클래스를 만드는 동안 ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

이것으로 Java의 Singleton 클래스에 대한이 기사의 끝으로 이동합니다. Java에 대한 자세한 내용은 다음을 참조하십시오. .

Java에서 Singleton 클래스가 무엇인지 이해 했으므로 이제 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Java 개발자가 되고자하는 학생과 전문가를 위해 설계되었습니다. 이 과정은 Java 프로그래밍을 시작하고 Hibernate & Spring과 같은 다양한 Java 프레임 워크와 함께 핵심 및 고급 Java 개념 모두에 대해 교육하도록 설계되었습니다.

질문이 있으십니까? 이 '자바의 싱글 톤 클래스'기사의 주석 섹션에 언급 해 주시면 가능한 한 빨리 답변을 드리겠습니다.