Мне было интересно, есть ли "простой" способ безопасно обновлять неизменяемые коллекции 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 вызывает обновление ((13,37)) и успешно обновляет переменную x. Нить А продолжается и заканчивается.
После того, как все это закончится, значение x будет равно карте, содержащей {1 = > 2, 3 = > 4}, правильно? Вместо желаемого {1 = > 2, 3 = > 4, 13 = > 37}. Есть ли простой способ исправить это? Я надеюсь, что это неудивительно, что я прошу:)
Кстати, я знаю, что есть такие решения, как Akka STM, но я бы предпочел не использовать их, если это необходимо.
Спасибо за любой ответ!
edit: Кроме того, я бы предпочел решение без блокировки. Eeeew:)