[JAVA] Singleton Pattern

99winnmin·2022년 6월 28일
0

java

목록 보기
5/10

싱글톤 패턴(singleton pattern)

개념

어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴이다 -> 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환해줌!!
인스턴스가 오직 1개만 생성되는 특징을 가진 싱글턴 패턴을 이용하여 여러 thread가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있기 때문에 요청이 많은 곳에서 사용하면 효율을 높일 수 있으나 동시성(Concurrency)문제를 고려해서 설계해야함!

구현

public class SingletonClass {
    private static SingletonClass instance = new SingletonClass();

    private SingletonClass(){}

    public static SingletonClass getInstance(){
        if(instance == null){
            instance = new SingletonClass();
        }
        return instance;
    }
}

장점

  • 고정된 메모리 영역에 할당되면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음
  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움
  • 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 때 사용
  • 다시 호출될때 객체 로딩 시간이 줄어 성능이 좋아지는 장점
  • DBCP(DataBase Commection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용됨

단점

  • 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우에 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 됨
  • 이는 oop설계 원칙에 어긋나기 때문에 수정이 어려워지고 유지보수의 비용이 높아짐
  • 또한 multi-thread 환경에서 동기화 처리를 안해줄 경우 인스턴스가 다수 개 생성될 수 있는 가능성이 있음(꼭 필요한 상황이 아니면 지양하기!!)

동기화 문제를 해결하는 가장 일반적인 방법

public class SingletonClass {
    private SingletonClass(){}
    private static class LazyHolder{
    	public static final SingletonClass instance = new SingletonClass();
    }
    public static SingletonClass getInstance(){
        return LazyHolder.instance;
    }
}

이 방법은 JVM의 클래스 초기화 과정에서 보장되는 원자적 특성을 이용하여 초기화 문제에 대한 책임을 JVM에 떠 넘긴 방식(holder안에 선언된 instance가 static이기 때문에 클래스 로딩시점에 한번만 호출되고 final이므로 다시 값이 할당되지 않게 함)

profile
功在不舍

0개의 댓글