반응형
아래 코드는 Android developer 페이지의 Codelabs에서 제공하는 예시 코드이다. 해당 코드를 보면 Singleton 구현 시 변수에 @Volatile Annotation을 붙히는 것을 볼 수 있다. 이게 어떤의미 일까?
// Annotates class to be a Room Database with a table (entity) of the Word class
@Database(entities = arrayOf(Word::class), version = 1, exportSchema = false)
public abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
// Singleton prevents multiple instances of database opening at the
// same time.
@Volatile
private var INSTANCE: WordRoomDatabase? = null
fun getDatabase(context: Context): WordRoomDatabase {
// if the INSTANCE is not null, then return it,
// if it is, then create the database
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
WordRoomDatabase::class.java,
"word_database"
).build()
INSTANCE = instance
// return instance
instance
}
}
}
}
싱글톤 구현 시 가장 중요한 것은 단 하나의 인스턴스만 생성이 되야하는 것을 보장해야 한다. 멀티코어 환경에서는 이러한 보장을 위해 다양한 기법이 존재하고, 코틀린(+자바)에서는 @Volatile Annotation의 방법을 제공한다.
요즘 PC의 성능 향상을 위해 각 코어에는 레지스터가 존재하고, 캐시가 존재한다. 그리고 메모리를 각 코어에서 공유를 하는 형태의 구조이다. 그렇기에 각 코어 별로 변수가 레지스터에 패치되어 존재하면 위처럼 싱글톤에서 인스턴스가 하나만 생성되는 것을 보장하지 못할 수 도 있다.
@Volatile 은 이러한 문제를 방지하기 위해 해당 데이터가 메모리에만 존재하도록 명시한다. 각 코어는 캐시로 데이터를 패치하여 가져가서 성능을 향상시키지 않고 메모리에 접근하기에 하나의 인스턴스를 보장하지만, 성능은 하락할 수 있음을 기억해야 한다.
참고
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/
https://developer.android.com/codelabs/android-room-with-a-view-kotlin?hl=ko#7
반응형
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] Flow<List<T>> 에서 List<T>로 변환하기. (0) | 2022.09.15 |
---|---|
[Kotlin/Plugin] Json으로 data class 추출하기 (0) | 2022.07.28 |
[Kotlin] Object (0) | 2022.06.22 |
[Kotlin] Scope Function (작성중) (0) | 2022.05.22 |
[Kotlin] Coroutine Builder 간략 정리 (0) | 2022.04.25 |