【问题标题】:Why is a Room database initialisation synchronized?为什么 Room 数据库初始化会同步?
【发布时间】:2021-04-26 15:21:50
【问题描述】:

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

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

【问题讨论】:

    标签: android android-room androidx synchronized


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 明白。谢谢。
    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多