对象中的可变值

时间:2012-04-18 20:56:14

标签: class scala immutability mutable

在Scala中,如果我计划拥有一个对象的可变属性(例如一个数字),何时适合

  1. 创建一个var并使用不可变数据结构?
  2. 创建一个val并使用可变数据结构?
  3. 我想猜测你是否想要将#2用于线程应用程序?一些集合是否是线程安全的?

    一般情况如何? (或者这不重要吗?)

2 个答案:

答案 0 :(得分:2)

不完全回答你的问题,但是......

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

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

你仍然可以得到更像这样的惯用Scala访问器,你可以使用特殊的原子变换器方法(如def putIfAbsent(k: A, v: B): Option[B]def replace(k: A, oldvalue: B, newvalue: B): Boolean)。

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

答案 1 :(得分:1)

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