在使用 Room 中的抽象类初始化数据库时,通常使用 synchronized
完成实例创建。这是为什么?
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
DatabaseClass::class.java,
"database_name",
)
.fallbackToDestructiveMigration()
.build()
答案 0 :(得分:0)
这是为了控制不同线程同时访问数据库,防止创建多个实例。如果你没有在这里同步,那么两个不同的线程都可以创建一个新的数据库实例,而单例模式应该在你的程序的生命周期内促进一个共享实例。 >
但是,您在问题中链接的示例通常还不够,您应该使用诸如双重检查锁定之类的方法。所以这可能会更好:
return INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase().also {
INSTANCE = it
}
}
作为旁注,这不是必需的。您可能没有同步和共享实例。然而,由于昂贵的初始化成本,建议将数据库设为单例,因此这是使用模式的一个示例。