android - 为什么 Room 数据库初始化会同步?
问题描述
在使用 Rooms 中的抽象类初始化数据库时,通常使用synchronized
. 为什么是这样?
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
DatabaseClass::class.java,
"database_name",
)
.fallbackToDestructiveMigration()
.build()
解决方案
这是为了控制一次访问数据库的不同线程,以防止创建多个实例。如果您没有在此处同步,那么两个不同的线程都可以创建数据库的新实例,而单例模式应该在程序的整个生命周期中促进单个共享实例。
但是,您在问题中链接的示例通常还不够,您应该使用诸如双重检查锁定之类的东西。所以这可能会更好:
return INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase().also {
INSTANCE = it
}
}
作为旁注,这不是必需的。您可能没有同步,也没有共享实例。然而,由于昂贵的初始化成本,建议数据库是单例的,因此这是使用模式的一个示例。
推荐阅读
- unit-testing - 使用 vue-test-utils v1 找到非存根转换包装器的最佳方法
- authentication - 询问登录凭据的共享点 Web 部件
- drop-down-menu - 在悬停时显示一个 Bootstrap 下拉菜单,而不是全部
- node.js - 猫鼬填充,execPopulate 不起作用
- node.js - 如何在激活断点的 Visual Studio Code 中调试 NodeJS start-server-and-test Jest 测试
- firebase - 为什么出现在 Firebase StreamView 中的某些用户的名称旁边显示“0”,而其他用户的名称旁边显示“1”?
- python - 熊猫读取和大型数据库并在之后将其写回
- keycloak - Keycloak 中的授权码授予流程
- c - C中的&p和*p_p有什么区别?
- c++ - 如何将类的属性从 c++ 获取到 QML