Я рассмотрел две коллекции с аналогичной концепцией - ParHashMap
от Scala и ConcurrentHashMap с Java. Обе они имеют одинаковую временную сложность, и обе они являются потокобезопасными и незакрепленными, но они основаны только на разных концепциях под капотом и хеш-таблицей соответственно. И это рассуждение приводит к вопросу: зачем нам нужен ParHashMap из Scala, в то время как ConcurrentHashMap с Java?Почему мы нуждаемся в ParHashMap из Scala, в то время как ConcurrentHashMap из Java
ответ
ConcurrentHashMap
является потокобезопасным Map<>
осуществления. Если вы одновременно используете несколько потоков, они будут синхронизироваться.
ParHashMap
- это параллельная коллекция. Если вы выполняете операции здесь (например, map()
, filter()
, aggregate()
) Scala будет распараллелить его для вас (аналогично Spark, но только внутри одной JVM).
Подводя итог, ConcurrentHashMap
дает примитиву синхронизировать потоки для параллелизма, ParHashMap
выполняет как синхронизацию, так и выполнение.
Редактировать: Обратите внимание, что ParHashMap
не является само по себе нитевым. Идея состоит в том, чтобы вызвать его методы из одного потока и позволить параллелизму обрабатываться самой параллельной структурой данных.
@ Вы сказали: «Если вы выполняете операции здесь (например, map(), filter(), aggregate()), Scala будет распараллеливать его для вас.« Как он работает, подобно механизму распараллеливания Spark? – pacman
Да, похоже, но только внутри одной машины. Вы можете указать поток, который будет использоваться. – marios
На самом деле изобретатель Искры сказал, что он черпал вдохновение из параллельной коллекции Scala, изобретая абстракцию RDD. – marios
ConcurrentHashMap не запирать бесплатно – talex
@talex Вы не правы - https://en.wikipedia.org/wiki/Java_ConcurrentMap#Lock-free_atomicity – pacman
@talex Я думаю, что он будет использоваться без блокировки бесплатно, но что изменилось в Java 8. –