Подтвердить что ты не робот

Возможны ли Scala параллельные коллекции в некотором роде, чем параллельные коллекции, уже доступные в Java?

Недавно я узнал о различных библиотеках для concurrency в Java, таких как ConcurrentHashMap и прекрасная неблокирующая из Клифф Нажмите

Я мало что знаю о Scala, но я слышал хорошие вещи о недавней библиотеке параллельных коллекций.

Я хотел бы знать, какие основные преимущества дает эта библиотека для библиотек на основе Java?

4b9b3361

Ответ 1

Две коллекции предназначены для разных целей.

Совлокальные коллекции Java позволяют использовать их из параллельного контекста: многие потоки могут обращаться к ним одновременно, и коллекция будет обязательно делать правильные вещи (поэтому вызывающим абонентам не нужно беспокоиться о блокировках и т.д.).

Scala параллельные коллекции, напротив, предназначены для запуска операций высокого порядка самостоятельно, без необходимости беспокоиться о создании потоков. Поэтому вы можете написать что-то вроде:

myData.par.filter(_.expensiveTest()).map(_.expensiveComputation())

и каждый из фильтров и карт будет выполняться параллельно (но фильтр будет завершен до начала карты).

Ответ 2

Чтобы немного расширить ответ Rex: причина, по которой в моделях Scala не очень интересна коллекция моделей, совместимых со стилями Java, - это ее смещение для данных, которые могут быть несовместимыми: наиболее распространенным способом реализации concurrency в Scala является (которая основана на неизменяемых данных), а не на потоках.

Ответ 3

В дополнение к Rex Kerr ответьте выше о параллельных и параллельных коллекциях, работающих в двух разных целях, я бы добавил, что Java фактически реализует параллельный массив от Doug Lea в дополнительный пакет JSR 166 - эта коллекция позволяет выполнять массовые операции над элементами массива, не будучи подходящими для одновременного доступа без явной синхронизации. Одна большая разница в том, что параллельные коллекции Scala имеют параллельные реализации для других коллекций, а не только массивы. Это:

  • ParVector
  • ParRange
  • mutable.ParHashMap
  • mutable.ParHashSet
  • immutable.ParHashMap
  • immutable.ParHashSet

Все последовательные варианты этих коллекций могут быть напрямую преобразованы в их параллельные копии (метод par). Другие последовательные коллекции могут быть преобразованы в некоторые из вышеперечисленных коллекций в линейном времени относительно размера коллекции.

Некоторые дополнительные структуры данных находятся на пути будущих выпусков, включая некоторые параллельные коллекции, которые также позволят осуществлять одновременный доступ.