【问题标题】:Kotlin Room Database Singleton PatternKotlin 房间数据库单例模式
【发布时间】:2021-10-20 23:31:16
【问题描述】:

我正在尝试创建单人房间数据库。我找到了 2 个解决方案,但我不知道它们之间有什么区别。

据此文档https://developer.android.com/codelabs/kotlin-android-training-room-database?hl=en&continue=https%3A%2F%2Fcodelabs.developers.google.com%2F%3Fcat%3Dandroid#5

companion object {
    @Volatile private var INSTANCE:AppDatabase? = null
    fun getInstance(context: Context):AppDatabase {
        synchronized(this){
            var instance = INSTANCE

            if (instance == null){
                instance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"user_table")
                    .fallbackToDestructiveMigration()
                    .build()
                INSTANCE = instance
            }
            return instance
        }
 }

还有这个根据Singleton class in Kotlin

companion object {
fun getInstance(context: Context):AppDatabase{
        return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"user_table")
            .fallbackToDestructiveMigration()
            .build()
    }
}

我尝试了这些,它们都给了我相同的实例。它们之间有什么区别吗?在性能或其他方面

【问题讨论】:

    标签: android kotlin singleton android-room


    【解决方案1】:

    不同之处在于第一个解决方案是多线程安全实例化。这些将有助于防止不同的线程重新实例化您的数据库实例

    如果您注意到,那里有 @Volatilesynchronized(this) 块。

    1. @Volatile 此处有助于立即使对 var INSTANCE:AppDatabase 的更改对其他线程可见
    2. synchronized(this) 将确保只有一个线程访问该块

    找到了几个解释多线程安全和竞争条件的来源,我认为这个one也可以帮助理解在什么样的条件下应该使用多线程安全方式

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2022-01-22
      相关资源
      最近更新 更多