首页 > 解决方案 > 为什么 Room 数据库初始化会同步?

问题描述

在使用 Rooms 中的抽象类初始化数据库时,通常使用synchronized. 为什么是这样?

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

标签: androidandroid-roomandroidxsynchronized

解决方案


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

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

return INSTANCE ?: synchronized(this) {

    INSTANCE ?: buildDatabase().also {

        INSTANCE = it
    }
}

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


推荐阅读