繁体   English   中英

Kotlin Room 数据库单例模式

[英]Kotlin Room Database Singleton Pattern

我正在尝试创建单身房间数据库。 我找到了 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
        }
 }

而这个根据Kotlin 中的 Singleton 类

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

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

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

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

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

发现了几个来源解释关于多线程安全和竞争条件,我觉得这一个也发现可能有助于应该使用什么样的条件下多线程安全的方式来理解

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM