2017-01-09 9 views
1

Я рассмотрел две коллекции с аналогичной концепцией - ParHashMap от Scala и ConcurrentHashMap с Java. Обе они имеют одинаковую временную сложность, и обе они являются потокобезопасными и незакрепленными, но они основаны только на разных концепциях под капотом и хеш-таблицей соответственно. И это рассуждение приводит к вопросу: зачем нам нужен ParHashMap из Scala, в то время как ConcurrentHashMap с Java?Почему мы нуждаемся в ParHashMap из Scala, в то время как ConcurrentHashMap из Java

+0

ConcurrentHashMap не запирать бесплатно – talex

+0

@talex Вы не правы - https://en.wikipedia.org/wiki/Java_ConcurrentMap#Lock-free_atomicity – pacman

+0

@talex Я думаю, что он будет использоваться без блокировки бесплатно, но что изменилось в Java 8. –

ответ

2

ConcurrentHashMap является потокобезопасным Map<> осуществления. Если вы одновременно используете несколько потоков, они будут синхронизироваться.

ParHashMap - это параллельная коллекция. Если вы выполняете операции здесь (например, map(), filter(), aggregate()) Scala будет распараллелить его для вас (аналогично Spark, но только внутри одной JVM).

Подводя итог, ConcurrentHashMap дает примитиву синхронизировать потоки для параллелизма, ParHashMap выполняет как синхронизацию, так и выполнение.

Редактировать: Обратите внимание, что ParHashMap не является само по себе нитевым. Идея состоит в том, чтобы вызвать его методы из одного потока и позволить параллелизму обрабатываться самой параллельной структурой данных.

+0

@ Вы сказали: «Если вы выполняете операции здесь (например, map(), filter(), aggregate()), Scala будет распараллеливать его для вас.« Как он работает, подобно механизму распараллеливания Spark? – pacman

+0

Да, похоже, но только внутри одной машины. Вы можете указать поток, который будет использоваться. – marios

+0

На самом деле изобретатель Искры сказал, что он черпал вдохновение из параллельной коллекции Scala, изобретая абстракцию RDD. – marios