Теоретически, использование MyActorLogic
, вооруженного простой изменяемой картой из нескольких потоков, может привести к исключению одновременной модификации (когда один поток пересекает карту, в то время как другой ее модифицирует).
Вы можете сделать следующее, чтобы избежать проблем:
- Поместите карту в актера (как приватный участник). В
Akka
вы не работаете с экземпляром Actor
напрямую (а обращаетесь к нему через прокси - ActorRef
). В этом случае безопасный доступ к карте будет гарантирован не только актером, который всегда обрабатывает одно сообщение за раз - другие потоки не смогут получить доступ к закрытым элементам даже через отражение.
- Вы можете сделать методы обновления / поиска
MyActorLogic
поточно-ориентированными (например, сделать их synchronized
)
- Вы можете использовать старый-добрый
ConcurrentHashMap
- Вместо
val map:mutable.Map
вы можете использовать var map:immutable.Map
. Таким образом, несколько потоков, обращающихся к map
, могут иногда работать с устаревшими данными, но одновременных модификаций не будет (подход копирования при записи).
Только для заметки, истинный синглтон будет:
object MyActorLogic{
val map:Map[String, Object] = Map()
...