[Kotlin] Singleton 패턴

김민주·2022년 11월 24일
0

자바에서 싱글톤을 생성하려면 여러가지 방법이 있다.


public class Singleton {

    private static Singleton singleton;
    private Singleton(){}

    //1. getInstance메서드를 통한 초기화 지연
    /*
    public static Singleton getInstance(){
        if(singleton == null) singleton = new Singleton();
        return singleton;
    }
     */

    //2. 싱글톤 스레드 세이프
    public static synchronized Singleton getInstance(){
        if(singleton == null) singleton = new Singleton();
        return singleton;
    }
    // 인스턴스가 필요한 시점에 동적 바인딩을 통해 생성되어 Thread-safe

	//3. synchronized 사용하지 않고 자원 낭비 없이 스레드 세이프하게 싱글톤
    private static class Holder{
    	private static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance(){
    	return Holder.instance;
    }
}

synchronized와 getInstance함수, 그리고 이너 클래스를 이용하여 스레드세이프하게 만든다.


그렇다면 이제 코틀린에서 싱글톤으로 구현해보자


class Singleton private constructor(context: Context) {

    companion object {
        @Volatile
        private var singleton: Singleton? = null

        fun getInstance(context: Context) =
            singleton ?: synchronized(Singleton::class.java) {
                singleton ?: Singleton(context).also {
                    singleton = it
                }
            }
    }
}
  • @Volatile : 변수의 값이 메인 메모리에만 적재되어, 스레드 동기화 문제를 막을 수 있는 어노테이션

synchronized로 인스턴스가 null인 경우 생성하여 반환해준다.

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글