这是一个关于 Realm 和 Kotlin 随机数生成器内部工作原理的问题。当我错误地在后台线程上打开了多个 Realm 事务实例(偶然多达 100 个)时,我观察到将 Realm 对象字段值设置为 kotlin.Random.nextInt() 会导致超过 20% 的时间发生冲突,这不应该发生。
Realm(或一般的内存)会在 kotlin.Random 上造成这样的副作用吗? 直觉上,随机数生成器不应受到我们本地数据库使用的影响。这也会影响像 UUID.randomUUID() 这样的行为吗?
此外,我知道 Realm 应该关闭 - 我真的很好奇为什么会这样。
open class MyObject: RealmObject {
var randomField: Int
}
fun test() = scope.launch { // background thread
var messageDupes = 0
var r = Realm.getInstance()
while (idx < 100) {
r = Realm.getInstance() // opening of Realm without closing
val random = Random.nextInt() // Why would this be affected? Has many collisions
val existing = r.where<MyObject>.equalTo("randomField", random)
if (existing != null) {
collisions++
}
val obj = MyObject()
obj.randomField = random //set field to the random value
r.executeTransaction {
it.insert(message)
}
idx++
delay(300L)
}
val count = r.where<MyObject>().count()
log.debug("total objects: $count; collisions=$collisions")
}