Возможны ли Scala параллельные коллекции в некотором роде, чем параллельные коллекции, уже доступные в Java?
Недавно я узнал о различных библиотеках для concurrency в Java, таких как ConcurrentHashMap
и прекрасная неблокирующая из Клифф Нажмите
Я мало что знаю о Scala, но я слышал хорошие вещи о недавней библиотеке параллельных коллекций.
Я хотел бы знать, какие основные преимущества дает эта библиотека для библиотек на основе Java?
Ответы
Ответ 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
). Другие последовательные коллекции могут быть преобразованы в некоторые из вышеперечисленных коллекций в линейном времени относительно размера коллекции.
Некоторые дополнительные структуры данных находятся на пути будущих выпусков, включая некоторые параллельные коллекции, которые также позволят осуществлять одновременный доступ.