Мне было интересно, есть ли какой-нибудь простой способ безопасно обновить неизменяемые коллекции scala.Рассмотрим следующий код:
class a {
private var x = Map[Int,Int]()
def update(p:(Int,Int)) { x = x + (p) }
}
Этот код не является потокобезопасным, верно?Под этим я подразумеваю, что если у нас есть два потока, вызывающих метод обновления, и допустим, что x - это карта, содержащая {1 => 2}, а поток A вызывает обновление ((3,4)), и ему удается только выполнить x + (p)часть кода.Затем происходит перепланирование, и поток B вызывает update ((13,37)) и успешно обновляет переменную x.Нить А продолжается и заканчивается.
После того, как все это закончится, значение x будет равно карте, содержащей {1 => 2, 3 => 4}, правильно?Вместо желаемого {1 => 2, 3 => 4, 13 => 37}.Есть ли простой способ это исправить?Я надеюсь, что понятно то, что я спрашиваю:)
Кстати, я знаю, что есть решения, подобные Akka STM, но я бы предпочел не использовать их, если в этом нет необходимости.
Большое спасибо за любыеответ!
edit: Кроме того, я бы предпочел решение без блокировки.Eeeew:)