android - Kotlin 房间数据库单例模式
问题描述
我正在尝试创建单身房间数据库。我找到了 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)
将确保只有一个线程访问该块
找到了几个解释多线程安全和竞争条件的资源,我认为这个也找到了可能有助于理解在什么样的条件下应该使用多线程安全的方式
推荐阅读
- javascript - 如果我在(Promise.all)函数中设置返回数据的状态,则会导致无限循环
- python - 如何在猜谜游戏中创建猜测计数器
- javascript - javascript最不常见子序列,实现缓存
- sql-server - 由于字段长度,在链接表上插入(从 MS Access 到 SQL Server)失败
- sql - 使用 LIKE 关键字了解索引性能
- google-apps-script - 从谷歌表到日历的时区差异
- html - 扩展引导页面内容的侧菜单行
- api-key - 使用 API 密钥在 Google Cloud Run 上获得 403 Forbidden
- javascript - Vue:是否可以导入仅适用于该组件的 js
- php - Laravel - 使用多态关系存储数据