在Scala中,如果我计划拥有一个对象的可变属性(例如一个数字),何时适合
我想猜测你是否想要将#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
。这两种选择都不会给你自动同步。