gpt4 book ai didi

kotlin - 从两个线程更改不可变数据结构

转载 作者:行者123 更新时间:2023-12-02 13:23:15 25 4
gpt4 key购买 nike

我尽可能地使用不可变的数据结构,因为使用它们真的很容易。但问题是当两个线程修改数据结构时。在这种情况下,synchronized keyworks 有帮助,但不是不可变数据结构的原因之一,以避免 synchroinzed ?

从两个线程修改不可变列表的更直观的方法是什么?

data class MyEvent(val time: Long, val somethingElse: String)
class EventReceiver {
private var events = listOf<MyEvent>()

// called several times a second
fun addEvent(e: MyEvent) {
synchronized(this) {
events += e
}
}

// internal cron-trigger calls this every 10 seconds
fun purge(olderThan: Long) {
synchronized(this) {
events = events.filter { it.time < olderThan }
}
}
}

最佳答案

不可变的数据结构不能被改变 - 它的名字。这意味着它没有修改其状态的方法。如果有,它不是一成不变的。
因此,您的 EventReceiver不是一成不变的,您需要针对数据竞争进行设计以使其线程安全。

使数据结构线程安全的方法之一是使用锁来保护对有争议的属性的访问,例如使用 synchronized就像你在这里做的一样。

关于kotlin - 从两个线程更改不可变数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50924806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com