Как обработать одновременный доступ к коллекции Scala?

У меня есть Actor, который - по самой своей сути - ведет список объектов. Он имеет три основные операции, add, update и remove (где иногда remove вызывается из метода add, но это в стороне), и работает с одной коллекцией. Очевидно, что доступ к этому опорному списку осуществляется параллельно, вызовы add и remove постоянно чередуются друг с другом.

В моей первой версии использовался ListBuffer, но я где-то читал, что он не предназначен для одновременного доступа. Я не получал исключений при одновременном доступе, но заметил, что поиск и удаление объектов из него не всегда работают, возможно, из-за параллелизма.

Я наполовину переписал его, чтобы использовать var List, но удаление элементов из стандартного неизменяемого списка Scala - это немного больно - и я сомневаюсь, что он подходит для параллельного доступа.

Итак, основной вопрос: Какой тип коллекции следует использовать в ситуации одновременного доступа, и как он используется?

(Возможно, вторичный: является ли Actor на самом деле многопоточной сущностью, или это просто мое неверное представление, и обрабатывает ли он сообщения по одному в одном потоке?)

(Третичный: В Scala, какой тип коллекции лучше всего подходит для вставки и случайного доступа (удаление / обновление)?)

Edit: To the kind responders: Прошу прощения за поздний ответ, у меня появилась неприятная привычка сбрасывать вопрос на SO или в списки рассылки, а затем переходить к следующей проблеме, забывая на время о первоначальной.

11
задан fwielstra 14 December 2011 в 14:09
поделиться