synchronized singleton vs Bill Pugh Singleton

김도현·2024년 3월 13일

synchronized singleton

public class TestService {

  private static TestService instance;

  public TestService() {
  }

  public static synchronized TestService getInstance() {
    if (instance == null) {
      instance = new TestService();
    }
    return instance;
  }
  • synchronized 키워드를 사용한 싱글톤 구현 방식
  • 이러한 전통적인 싱글톤 구현 방식은 멀티스레드 환경에서 성능 저하를 초래할 수 있음
  • synchronized 키워드를 사용하면 해당 메서드나 블록에 동시에 하나의 스레드만 접근 가능
  • 그래서 꼭 필요한 경우가 아니면 성능을 위해서 쓰지말자 !

Bill Pugh Singleton

public class TestService {

    private TestService() {
    }

    private static class SingletonHelper {
        private static final TestService INSTANCE = new TestService();
    }

    public static TestService getInstance() {
        return SingletonHelper.INSTANCE;
    }
}
  • Bill Pugh 싱글톤 구현 방식은 java의 클래스 로딩 메커니즘을 활용하여, 멀티스레드 환경에서도 동기화 문제 없이 싱글톤 인스턴스를 효율적으로 생성할 수 있는 방법이다.
  • 이 방식은 내부 정적(static) 헬퍼 클래스를 사용하여 싱글톤 인스턴스를 생성함
  • 구현 방법
    • TestService 클래스는 외부에서 인스턴스를 생성하지 못하도록 생성자를 private 로 선언한다.
    • 싱글톤 인스턴스는 SingletonHelper 라는 내부 정적 클래스 내에 정의되어 있으며, 이 인스턴스에 접근하기 위한 'getInstance()' 메서드를 통해 제공된다.
    • TestService 클래스는 getInstance 메서드가 호출될 때 처음으로 참조되므로, 이 시점에 TestService 인스턴스가 생성된다.
profile
Just do it

0개의 댓글