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

Why is a Room database initialisation synchronized?

在 Rooms 中使用抽象 class 初始化数据库时,实例创建通常使用 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
    }
}

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