我正在尝试创建单人房间数据库。我找到了两种解决方案,但我不知道它们之间有什么区别。
根据这个文件
companion object {
@Volatile private var INSTANCE:AppDatabase? = null
fun getInstance(context: Context):AppDatabase {
synchronized(this){
var instance = INSTANCE
if (instance == null){
instance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"user_table")
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
}
return instance
}
}
而这个根据Kotlin 中的单例类 https://stackoverflow.com/questions/51834996/singleton-class-in-kotlin/51835156
companion object {
fun getInstance(context: Context):AppDatabase{
return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"user_table")
.fallbackToDestructiveMigration()
.build()
}
}
我尝试了这些,它们都给了我同样的例子。他们之间有什么区别吗?无论是从性能还是其他方面
不同之处在于第一个解决方案是多线程安全实例化。这些将有助于防止不同的线程重新实例化您的数据库实例
如果你注意到的话,有@Volatile
and synchronized(this)
堵在那里。
-
@Volatile
这里有助于立即进行更改var INSTANCE:AppDatabase
对其他线程可见
-
synchronized(this)
将确保只有一个线程访问该块
找到了几个解释多线程安全和竞争条件的来源,我认为这个one https://proandroiddev.com/synchronization-and-thread-safety-techniques-in-java-and-kotlin-f63506370e6d还发现可能有助于理解在什么样的情况下应该使用多线程安全方式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)