【发布时间】:2015-11-12 12:46:39
【问题描述】:
我需要在 Scala 中的多线程环境中缓存一些东西。
阅读 scalaz 的 Memo,我在 the code 中发现了以下关于不可变哈希映射备忘录的评论:
由于本备忘录使用单个 var,因此它是线程安全的。
代码如下:
def immutableMapMemo[K, V](m: Map[K, V]): Memo[K, V] = {
var a = m
memo[K, V](f =>
k => {
a get k getOrElse {
val v = f(k)
a = a updated (k, v)
v
}
})
}
说这是线程安全的,这与我迄今为止所阅读和了解的关于 JVM 平台上的线程安全的知识相悖;参考更新可能是原子的,但据我所知,如果您没有内存屏障,编译器可能会尝试进行某些优化,从而扰乱发生之前的关系。参见例如this post 和this。
但我敢肯定 scalaz 的人很聪明。也许a 的范围有什么特别之处。
评论所声称的是否属实,如果是,为什么?
【问题讨论】:
-
根据您的经验,这里实际上对线程安全有什么影响?
var更新是引用分配,所以它是原子的。所有其他操作都不会改变对象,因此a中的任何时候都有Map[k,V]的一些一致版本 -
我会更新我的问题以澄清。
标签: scala hashmap thread-safety scalaz memoization