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
}
참고
- How singleton pattern works with Golang https://medium.com/golang-issue/how-singleton-pattern-works-with-golang-2fdd61cd5a7f
- sync package https://pkg.go.dev/sync