Я читаю документ Java о stream https://docs.oracle. com / javase / 8 / docs / api / java / util / stream / package-summary.html.

Раздел Reduction, concurrency, and ordering сбивает с толку: введите описание изображения здесь

Я сформулировал свой вопрос на скриншоте. Короче говоря, имеет ли смысл использовать параллельное сокращение, когда тип результата - Map вместо ConcurrentHashMap?

Заранее спасибо!

0
powerseed 2 Май 2021 в 21:14

2 ответа

Лучший ответ

Map - это интерфейс, а ConcurrentHashMap - реализация. Смысл, который они пытаются донести, заключается в том, что реализация должна иметь возможность обрабатывать одновременные операции записи / внесения / размещения. Он должен быть потокобезопасным, поскольку при параллельном использовании он будет доступен из другого потока. Если бы у вас была другая реализация, которая также является потокобезопасной, она работала бы так же, как и будет.

0
groot sarchy 2 Май 2021 в 18:20

Думаю, вы уже можете прочитать, что значит программирование интерфейса, это поможет вам понять концепцию.

В этом случае вы можете легко найти тип возвращаемого значения, выполнив одно из следующих действий.

Код

List<Integer> integers = List.of(1, 2, 3);

Map<Integer, List<Integer>> sequential = integers.stream().collect(Collectors.groupingBy(Function.identity()));
System.out.println("sequential.getClass() = " + sequential.getClass());

Map<Integer, List<Integer>> parallel = integers.parallelStream().collect(Collectors.groupingByConcurrent(Function.identity()));
System.out.println("parallel.getClass() = " + parallel.getClass());

Печать

sequential.getClass() = class java.util.HashMap
parallel.getClass() = class java.util.concurrent.ConcurrentHashMap

Означает, что ConcurrentHashMap действительно используется

Исходники JDK

Вы можете видеть, что использованная реализация: ConcurrentHashMap

public static <T, K> Collector<T, ?, ConcurrentMap<K, List<T>>>
    groupingByConcurrent(Function<? super T, ? extends K> classifier) {
        return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList());
    }

Но обратите на это внимание, так как в будущем он может измениться на другую реализацию. Это очень ясно сказано в javadoc этого Collector

Нет никаких гарантий относительно типа, изменчивости или сериализуемости возвращаемых объектов ConcurrentMap или List, а также поточной безопасности возвращаемых объектов List.

2
Yassin Hajaj 2 Май 2021 в 18:42