Kotlin Room 数据库单例模式
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)
将确保只有一个线程访问此块
找到了几个解释多线程安全和竞争条件的资源,我认为这个one也发现可能有助于理解在什么样的条件下应该使用多线程安全方式
我正在尝试创建单身房间数据库。我找到了 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)
将确保只有一个线程访问此块
找到了几个解释多线程安全和竞争条件的资源,我认为这个one也发现可能有助于理解在什么样的条件下应该使用多线程安全方式