클래스 인스턴스를 단 하나만 만들어야 할 경우 사용
코틀린은 object를 사용한다
object DBHandler {...}
val dbHandler = DBHandler
class DBHandler private constructor(context: Context) {
companion object {
private var instance: DBHandler? = null
fun getInstance(context: Context) =
instance ?: DBHandler(context).also {
instance = it
}
}
}
스래드가 인스턴스를 확인하고 null이면 새로 만들고 아니면 그대로 반환, 인스턴스는 하나만 가지게 된다!
두개의 스레드가 동시에 인스턴스 상태를 확인하면, 객체가 중복 생성 할 수 있게 되어 싱글턴이 깨진다 (스레드 동기화 문제)
-> double checked locking
class DBHandler private constructor(context: Context) {
companion object {
@Volatile //인스턴스가 메인 메모리를 바로 참조하여 인스턴스 중복 생성 방지
private var instance: DBHandler? = null
//동시성 체크 - 각 스레드가 동시에 실행되지 못하도록
fun getInstance(context: Context) =
instance ?: synchronized(DBHandler::class.java) {
instance ?: DBHandler(context).also {
instance = it
}
}
}
}
참조 : https://cliearl.github.io/posts/android/understanding-singleton-pattern/