Kotlin 从两个线程更改不可变的数据结构

Kotlin 从两个线程更改不可变的数据结构,kotlin,immutability,Kotlin,Immutability,我尽可能多地使用不变的数据结构,因为使用它们非常容易。但问题是当两个线程修改数据结构时。在这种情况下,synchronizedkeyworks有助于避免synchronized,但这不是不可变数据结构的原因之一 从两个线程修改不可变列表的更理想的方法是什么 data class MyEvent(val time: Long, val somethingElse: String) class EventReceiver { private var events = listOf<My

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

从两个线程修改不可变列表的更理想的方法是什么

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 }
        }
    }
}
数据类MyEvent(val-time:Long,val-somethingElse:String)
类事件接收器{
private var events=listOf()
//一秒钟打几次电话
乐趣补充(e:MyEvent){
已同步(此){
事件+=e
}
}
//内部cron触发器每10秒调用一次
趣味净化(olderThan:Long){
已同步(此){
events=events.filter{it.time
不可变的数据结构不能变异-它在名称中。这意味着它没有修改其状态的方法。如果有,它不是一成不变的。 因此,您的
EventReceiver
不是一成不变的,您需要为数据竞争进行设计,以使其线程安全


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

不可变意味着不能修改,而您的数据结构(
EventReceiver
对象)不是这样的吗?相关:您的权利。但是问题应该针对这个问题,如何处理来自两个线程的不可变列表的可变。你不能。正如我所说,一个不变的列表是不能变异的。