Esta implementação de particionamento do IntStream realmente não é segura para threads?

wouterio:

Esta resposta fornece uma implementação para particionar um IntStream:

IntStream intStream = IntStream.iterate(0, i -> i + 1).limit(1000000);

Predicate<Integer> p = x -> r.nextBoolean();
Map<Boolean, List<Integer>> groups = intStream.collect(() -> {
    Map<Boolean, List<Integer>> map = new HashMap<>();
    map.put(false, new ArrayList<>());
    map.put(true, new ArrayList<>());
    return map;
}, (map, x) -> {
    boolean partition = p.test(x);
    List<Integer> list = map.get(partition);
    list.add(x);
}, (map1, map2) -> {
    map1.get(false).addAll(map2.get(false));
    map1.get(true).addAll(map2.get(true));
});

System.out.println(groups.get(false).size());
System.out.println(groups.get(true).size());

Mas sua edição menciona que essa implementação não é segura para threads. Até onde posso ver, no entanto, o coletor cria um separado HashMap<List<Integer>>para cada thread em um fluxo paralelo. Portanto, cada mapa é confinado a um único encadeamento. A função de particionamento também está restrita a um único encadeamento. A função de mesclagem mescla os resultados de vários threads, mas até onde eu sei, a estrutura do fluxo garante que a mesclagem seja feita de maneira segura. Então, minha pergunta: essa solução realmente não é segura para threads?

BTW: A resposta fornece uma solução mais elegante de qualquer maneira ( Stream<Integer> stream = intStream.boxed();etc), mas eu ainda gosto de saber.

PS: Gostaria de adicionar esta pergunta como um comentário à postagem original, mas nem tenho reputação de adicionar comentários ...: |

Wiingreen:

De acordo com a documentação do Oracles

Assim como reduzir (int, IntBinaryOperator), as operações de coleta podem ser paralelizadas sem exigir sincronização adicional.

https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#collect-java.util.function.Supplier-java.util.function.ObjIntConsumer-java.util. function.BiConsumer-

Parece que sua intuição está certa de que isso é seguro para threads.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Esta implementação de singleton é segura para thread?

Esta conversão para o subtipo é segura?

Por que essa implementação singleton "não é segura para threads"?

Esta consulta SQL é segura para injeção

Esta generalização do runST é segura?

Alternativa de JWT de cookie de envio duplo e XSRF - esta implementação é segura?

O uso de tokens JWT é realmente uma maneira segura de contornar as sessões do usuário?

Publicando campos de objetos não seguros de thread de maneira segura para threads

Como implementar o teste para esta implementação do Ngrx?

Mulesoft: - Forçar url de implementação para ouvir apenas proxy (ou) url de implementação segura

O EntityManager é realmente seguro para threads?

O GCD é realmente seguro para threads?

Por que essa classe não é segura para threads?

Implementação do prólogo de "Qual resposta nesta lista é a resposta correta para esta pergunta?"

Ao criar uma string em C, o arquivo do qual estou tentando copiar o conteúdo para esta string, faz isso antes de eu realmente dizer para

strprintf - esta implementação é segura e portátil?

Esta é a implementação correta do padrão de fábrica?

Esta função de rastreamento de raio que roda na GPU é segura para a GPU?

Como esta amostra do TensorFlow realmente atualiza os pesos para encontrar a solução

Esta é uma maneira segura de manter as pessoas fora do meu painel de administração?

A mutação de uma coleção não segura para threads em um construtor precisa ser sincronizada?

Incorporação do YouTube: tentativa de JavaScript não segura para acessar o quadro

Desempenho da consulta de particionamento do Postgres quando particionado para exclusão

Esta operação de atribuição de cópia é segura?

Como simular a implementação do gancho useState para que realmente mude o estado durante o teste

Por que a biblioteca asyncio é mais lenta do que os threads para esta operação de ligação de E / S?

Esta configuração .htacces é segura?

Alinhar o particionamento do conjunto de dados ao esquema de particionamento da tabela

Implementação LinkedHashMap segura de Java Thread?