2012-04-18 2 views
3

В Scala, если я планирую на иметь изменяемый атрибут (например, мешок чисел) объекта, когда уместно, чтобыИзменчивые значения в объекте

  1. Создать вар и использовать непреложный структура данных?
  2. Создать val и использовать изменяемую структуру данных?

Я собираюсь угадать, что вы хотите использовать # 2 для резьбовых приложений? Являются ли некоторые из сборников потокобезопасными?

Как насчет вообще? (Или это не важно?)

ответ

1

Между вашими вариантами 1 и 2 это не имеет значения - mutable изменен, и если вы читаете или изменяете значение из нескольких потоков, вам необходимо синхронизировать доступ к этому свойству, независимо от того, представляет собой var неизменной структуры данных или val изменчивой структуры данных. Ни один из вариантов не даст вам автоматической синхронизации.

2

не полный ответ на ваш вопрос, но ...

либо 1 или 2 в вашем вопросе не будет пригодным для многопоточной среды - val s с неизменными данными структуры. Для многопоточного доступа к изменяемым коллекциям я по-прежнему рекомендую коллекции Java из пакета java.util.concurrent. Например, для создания изменчивой, параллельная хэш-карты:

def emptyConcurrentHashMap[K, V] = { 
    import collection.JavaConverters._ 
    new java.util.concurrent.ConcurrentHashMap[K, V].asScala 
} 

Вы все еще получаете более идиоматический Scala Accessors, как это, и вы будете использовать специальные атомные методы мутаторных (как def putIfAbsent(k: A, v: B): Option[B] и def replace(k: A, oldvalue: B, newvalue: B): Boolean).

В качестве альтернативы вы можете использовать AtomicReference, который содержит неизменяемую коллекцию, и замените его на свой метод compareAndSet.

 Смежные вопросы

  • Нет связанных вопросов^_^