我尽可能使用不可变数据结构,因为它很容易使用它们。但问题是当两个线程修改数据结构时。在这种情况下,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 }
}
}
}
答案 0 :(得分:2)
不可变的数据结构不能改变 - 它在名称中。这意味着它上面没有修改其状态的方法。如果有,那就不是一成不变的。
因此,您的EventReceiver
不是不可变的,您需要设计数据竞争以使其线程安全。
使数据结构线程安全的一种方法是使用锁来保护对有争议属性的访问,例如像你在这里一样使用synchronized
。