scala - 带有 var 的不可变映射或带有 val 的可变映射?

标签 scala concurrency immutability scala-collections mutable

以下两个片段中哪个更有效且行为正确?

// snippet 1
var map = Map[String, Int]()   // immutable map with var
map.synchronized(map += "hello" -> 1)
map.synchronized(map -= "hello")

// snippet 2
val mmap = scala.collection.mutable.Map[String, Int]()
mmap.synchronized(mmap += "hello" -> 1)
mmap.synchronized(mmap -= "hello")

编辑:我正在寻找并发访问 map 的情况,其中多个不同的参与者共享同一张 map 并想要修改它。链接的问题还涉及 var 的一般情况和 val , 而我需要一些关于 Map 的见解收藏类型。

最佳答案

这取决于可变和不可变对象(immutable对象)都有其优点和缺点。

不可变对象(immutable对象)使并发编程更容易、更安全,并且您可以轻松地对它们进行推理。大多数发生在 JVM 并发周围的运行时错误是由于共享可变状态。

如果你的对象变大了,仅仅为了保持不可变状态而复制对象是没有意义的。在设计算法时,您必须明智地思考。

关于scala - 带有 var 的不可变映射或带有 val 的可变映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201204/

相关文章:

java - CompletableFuture 类中 join 方法的使用与 get 方法的使用

swift - 你必须手动指定你的DispatchQueue是串行的吗?

从 Synchronized block 调用 Java 方法

python - 在 python 中成对使用 frozenset

javascript - 为什么 immer.js 不允许在草稿上设置动态属性?

scala - Spark 2.2.0独立模式写入Dataframe到本地单节点Kafka时出错

git - 为什么致命的: Not a git repository error show up when publishing site using sbt-ghpages for valid git project?

variables - 在 Rust 中, "shadowing"和 "mutability"有什么区别?

映射 Map 时 Scala 不匹配

scala - 通过多个列表进行归纳证明