[英]Kotlin Room Database Singleton Pattern
我正在尝试创建单身房间数据库。 我找到了 2 个解决方案,但我不知道它们之间有什么区别。
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
}
}
companion object {
fun getInstance(context: Context):AppDatabase{
return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"user_table")
.fallbackToDestructiveMigration()
.build()
}
}
我尝试了这些,它们都给了我相同的实例。 它们之间有什么区别吗? 在性能或其他方面
不同之处在于第一个解决方案是多线程安全实例化。 这些将有助于防止不同的线程重新实例化您的数据库实例
如果您注意到,那里有@Volatile
和synchronized(this)
块。
@Volatile
这里有助于立即对其他线程可见的var INSTANCE:AppDatabase
进行更改synchronized(this)
将确保只有一个线程访问这个块发现了几个来源解释关于多线程安全和竞争条件,我觉得这一个也发现可能有助于应该使用什么样的条件下多线程安全的方式来理解
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.