在 Scala 中,如果我打算拥有一个对象的可变属性(例如一袋数字),那么什么时候适合
- 创建一个 var 并使用不可变的数据结构?
- 创建一个 val 并使用一个可变数据结构?
我将猜测您是否希望将#2 用于线程应用程序?某些集合是线程安全的吗?
一般情况如何?(或者真的不重要?)
在 Scala 中,如果我打算拥有一个对象的可变属性(例如一袋数字),那么什么时候适合
我将猜测您是否希望将#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
方法。
在您的选择 1 和 2 之间,没关系 - mutable 是可变的,如果您从多个线程读取或修改值,则需要同步对属性的访问,无论属性本身是否var
是不可变数据结构或val
可变数据结构的一个。这两种选择都不会给您自动同步。