为什么房间数据库初始化是同步的



在Rooms中使用抽象类初始化数据库时,实例创建通常使用synchronized完成。为什么会这样?

return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
DatabaseClass::class.java,
"database_name",
)
.fallbackToDestructiveMigration()
.build()

这是为了控制不同线程同时访问数据库,以防止创建多个实例。如果您在这里不同步,那么两个不同的线程都可以创建数据库的新实例,而singleton模式应该在程序的整个生命周期中为一个共享实例提供便利。

然而,您在问题中链接的示例通常是不够的,您应该使用类似双重检查锁定的方法。所以这可能更好:

return INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase().also {
INSTANCE = it
}
}

作为一个旁注,这是没有必要的。您可能没有同步,也没有共享实例。然而,由于昂贵的初始化成本,建议数据库为单例,因此这是一个要使用的模式示例。

最新更新