3

在 Scala 中,如果我打算拥有一个对象的可变属性(例如一袋数字),那么什么时候适合

  1. 创建一个 var 并使用不可变的数据结构?
  2. 创建一个 val 并使用一个可变数据结构?

我将猜测您是否希望将#2 用于线程应用程序?某些集合是线程安全的吗?

一般情况如何?(或者真的不重要?)

4

2 回答 2

2

不是您问题的完整答案,但是……</p>

您问题中的 1 或 2 都不适合多线程环境 -val具有不可变数据结构的环境。对于对可变集合的多线程访问,我仍然推荐 Javajava.util.concurrent包中的集合。例如,要创建一个可变的并发哈希映射:

def emptyConcurrentHashMap[K, V] = {
  import collection.JavaConverters._
  new java.util.concurrent.ConcurrentHashMap[K, V].asScala
}

您仍然可以获得像这样更惯用的 Scala 访问器,并且您将使用特殊的原子 mutator 方法(如def putIfAbsent(k: A, v: B): Option[B]and def replace(k: A, oldvalue: B, newvalue: B): Boolean)。

或者,您可以使用AtomicReference包含不可变集合的 an,并将其替换为它的compareAndSet方法。

于 2012-04-18T21:21:06.580 回答
1

在您的选择 1 和 2 之间,没关系 - mutable 是可变的,如果您从多个线程读取或修改值,则需要同步对属性的访问,无论属性本身是否var是不可变数据结构或val可变数据结构的一个。这两种选择都不会给您自动同步。

于 2012-04-19T06:00:29.740 回答