Golang

[Golang]싱글톤(singleton) 패턴 구현하기

stayhungri 2022. 7. 1. 13:51

싱글톤 패턴을 구현하는 방법에 대해서 다뤄보겠습니다. 

 

type singleton struct{}

var (
	instance *singleton
)

func New() *singleton {
	if instance == nil {
		instance = &singleton{} // <-- not thread safe
	}

	return instance
}

전역 변수를 하나 두고, 인서턴스 생성 요청이 들어올 때마다 기존에 생성했던 값이 없을 경우에만 새로 만들고, 기존에 만들어 둔게 있으면 기존 값을 리턴합니다. 위 방법에 단점은 thread safe 하지 않아 mutex와 once 를 활용한 방법을 알아보겠습니다.

 

 

아래는 mutex 을 활용한 thread safe 한 싱글톤 패턴입니다.

var lock = &sync.Mutex{}

func NewWithLock() *singleton {
	lock.Lock()
	defer lock.Unlock()
	if instance == nil {
		instance = &singleton{} // <-- thread safe
	}

	return instance
}

thread safe 해졌지만 생성 함수를 호출할 때마다 lock 을 걸었다가 푸는 작업을 하는게 아쉽습니다. 딱 1번만 실행을 시키고 싶을 때는 sync.Once 를 활용하면 됩니다.

 

아래는 once 를 활용한 thread safe 한 싱글톤 패턴입니다.

var once sync.Once

func NewWithOnce() *singleton {
	once.Do(func() { // atomic, 반복 호출 되지 않음
		instance = &singleton{} // <-- thread safe
	})

	return instance
}

 

 

참고