Мне нужно кэшировать что-то в Scala в многопоточной среде.Является экземпляром класса, который обновляет только один безопасный поток в Scala?
Чтение на scalaz-х Memo
я нашел следующий комментарий в the code для неизменной хэш карты памятки:
В этом документе используется один варом, это потокобезопасное.
код выглядит следующим образом:
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.
Но я уверен, что люди из скасаза довольно умны. Может быть, есть что-то особенное в области a
.
Является ли это то, что комментарий претендует на истину, и если да, то почему?
Что на самом деле идет против потоковой безопасности в вашем опыте? 'var' update - это ссылочное задание, поэтому оно является атомарным. Все остальные операции не мутируют объекты, поэтому в любое время в 'a' есть некоторая согласованная версия' Map [k, V] ' – Odomontois
. Я уточню свой вопрос, чтобы уточнить. –