Java Singleton pattern

java singleton pattern 에 대해 자세히 알아보자.

싱글톤 패턴이란?
어떠한 클래스의 객체가 하나만 존재하도록 제한할때 쓰는 패턴이다.

내가 그동안 알고 있었던 싱글톤 패턴은 가장 기본적인 패턴이었고
문제가 있는 패턴이었다.
아래와 같은 패턴이다.

private static 으로 instance변수를 가지고 있으며 null체크를 통해 인스턴스를 생성해준다.

단일 스레드에서는 문제가 없지만. 멀티 스레드 환경에서는 문제가 발생한다.

getInstance메소드에 대해 동시적인 접근을 하게되면 한개이상의 인스턴스가 생성될수 있다.

멀티 스레드에 대한 단일인스턴스 생성을 보장하기 위해 아래와 같이 작성될수 있겠다.

getInstance 메소드에 대해 synchonized 키워드를 붙여줌으로써 동시접근에 대한 제어를 할수있다.

하지만 여기에도 문제가 있다.
getInstance를 호출할때 마다 동시 접근 제어가 되기 때문에 성능적인 측면에서 좋지 않아 보인다.

getInstance메소드의 synchronized 키워드를 제거하고
if null check 블럭 내부에 synchronized 블럭을 작성했다.
최초 접근들에 대해서는 동기화 되어 instance가 생성되겠다.
이후에 대해서는 null체크 되기 때문에 위의 소스보다는 효율적으로 개선되었다.

class loading 시점을 이용한 방법도 있다.

클래스 로더가 해당 클래스를 로드하는 시점에 초기화 작업에서 instace를 생성하는 방법이 되겠다.

클래스 로더가 클래스를 로딩하는 작업이 동기화이기 때문에 멀티스레드에 영향이 없겠다.

하지만, 이 로직은 초기화 작업시 무조건 인스턴스를 만들기 때문에
호출에 의한 생성이 아니다.

아래와 같은 개선된 방법이 있다.

getInstance메소드 호출에서 내부 클래스 Singleton이 참조되며 클래스 로딩된다. 이 시점에 SingletonTest_4 클래스 인스턴스가 생성되겠다.

Java8에 도입된 람다식을 사용한 방법도 있다.
-_- 검증은..

추천되는 Best Design 으로 Enum Type 방식도 있다.

SingletonTest_6.INSTANCE 로 singleton이 보장된다.

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store