为什么 Room 数据库初始化是同步的?

时间:2021-04-26 15:21:50

标签: android android-room androidx synchronized

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

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

1 个答案:

答案 0 :(得分:0)

这是为了控制不同线程同时访问数据库,防止创建多个实例。如果你没有在这里同步,那么两个不同的线程都可以创建一个新的数据库实例,而单例模式应该在你的程序的生命周期内促进一个共享实例。 >

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

return INSTANCE ?: synchronized(this) {

    INSTANCE ?: buildDatabase().also {

        INSTANCE = it
    }
}

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