IT이야기/JAVA

[JAVA/Android] Singleton pattern 사용법과 멀티쓰레드 문제 해결!

FelixShin 2016. 2. 29. 00:11
반응형

이번시간에는 많이 사용하는 디자인 패턴인 싱글톤 패턴에 대해 알아보도록 하겠습니다.

아래의 그림처럼 싱글톤 패턴을 사용하면, 싱글톤패턴을 사용한 특정 클래스에 오로지 1개의 인스턴스를 통해 접근할 수 있습니다.




1. 싱글톤 패턴이란

하나의 프로그램 내에서 하나의 인스턴스만 생성해야하는 상황에서 사용. 

다양한 클래스에서 하나의 인스턴스를 공유해야할 때 사용


안드로이드(자바)에서 싱글톤 패턴을 사용할 때 아래와 같이 사용한다...



2. 기본적인 싱글톤 구현하기 (안드로이드, 자바 에서)


public class Singleton(){


private static Singleton singletonInstance;

public static Singleton getInstance(){
if(singletonInstance==null){
singletonInstance = new Singleton();
}
return singletonInstance;
}

}




3. 싱글톤 멀티스레딩 문제 해결법


Singleton is not thread safe


그러나, 여기서는 이 싱글톤이 thread safe하지 않을 수 있다. 즉 다중쓰레드에서 2개이상의 인스턴스가 생성 될 수 있다는 말이다. 불필요한 오버헤드가 생길 수 있다.



 해결 방법1 : 제한적인 해결방법


-> 단순히 이문제를 풀기 위해서 syncronized를 붙이면 위의 문제를 해결할 수 있음.

-> Bum 성능상의 이슈가 생길 수 있음


public class Singleton(){

private static Singleton singletonInstance;


public static synchronized Singleton getInstance(){
if(singletonInstance==null){

    singletonInstance = new Singleton();
         }
        return singletonInstance;
       }

}


해당 싱글톤 이슈가 어플에 그리 중요하지 않으면 나둬도 되지만, 

이 싱글톤으로 인해 100배 이상의 속도가 느려질 수도 있습니다.



 해결 방법2 : 최적 해결방법


-> 단순히 이문제를 풀기 위해 DCL(Double-Checking Locking을 써서 동기화되는 부분을 줄임

-> 처음에만 동기화가 되고 나중에는 동기화가 되지 않는 가장 적합한 방법임


# queueManagerInstance 변수 앞에 volatile 키워드를 붙여, DCL을 사용함

public class Singleton(){


private static volatile Singleton singletonInstance = null;


public static Singleton getInstance(){
if(singletonInstance==null){
synchronized (Singleton.class){
if(singletonInstance==null){
singletonInstance = new Singleton();
}
}
}
return singletonInstance;
}

}



출처 : 

Head First Design Pattern

http://www.jpstory.net/2013/05/singleton-pattern/