싱글톤 패턴을 구현하는 방법에 대해서 다뤄보겠습니다.
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
}
[Golang]문자열 양쪽 여백 혹은 문자(들) 삭제(Trim)하기 (0) | 2022.07.15 |
---|---|
[Golang]time.Time 구조체 기본값은 무엇일까요 (0) | 2022.07.08 |
[Golang] "net/http: TLS handshake timeout" error (0) | 2022.07.01 |
[Golang]UUID 만들기 (0) | 2022.06.24 |
[Golang]PNG 파일 JPG 로 변환하기 (0) | 2022.06.24 |