`
mwhgJava
  • 浏览: 97976 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java8 使用parallelStream线程安全地收集数据

阅读更多
http://zhk.me/1281.html

以下我们常用的数据结构,都是线程不安全的。

ArrayList, LinkedList
HashMap, LinkedHashMap, TreeMap
HashSet, LinkedHashSet, TreeSet
StringBuilder

parallelStream是以多线程的方式,执行定义的代码块。因为是多线程,所以在代码块里操作线程不安全的Collection,就会引发Concurrency问题。
List<String> results = Lists.newArrayList();
sources.parallelStream().forEach(source -> {
  results.add(sigmaString(source));
  results.add(lambdaString(source));
});  

这段代码,是将sources中的每个source,转换成sigma string和lambda string,然后收集到results里面。实际运行时,results由于多线程问题,有些数据没有add进来,丢失了。
Solution 1: 不用parallel
当sources数据不多时,可以去掉paralle,直接使用stream,就避免了Concurrency issue。
List<String> results = Lists.newArrayList();
sources.stream().forEach(source -> {
  results.add(sigmaString(source));
  results.add(lambdaString(source));
});

Solution 2: 使用collect方法
我们使用外面的集合,无非是为了收集元素。Java8 Stream的collect方法,就是收集Stream里的元素,返回List,Set或Map等,并且它是线程安全的。下面用collect改写上面的代码:
List<String> results = sources.parallelStream()
  .flatMap(source -> Stream.of(sigmaString(source), lambdaString(source)))
  .collect(Collectors.toList());

没有使用外部的集合,并且使用到了parallelStream并行处理的优势。
分享到:
评论

相关推荐

    关于Java8 parallelStream并发安全的深入讲解

    Java 8 的 `parallelStream` 是为了解决大数据量处理时的性能问题,它通过多线程并行处理数据流,极大地提升了效率。然而,正如标题和描述中指出的,`parallelStream` 并不保证线程安全。这意味着在并发操作中,如果...

    java1.8新特性stream.rar

    其中,Stream API是Java 8中最显著的新特性之一,它为处理集合数据提供了全新的方式。Stream API使得我们能够以声明式的方式处理数据,非常适合进行并行计算和大数据操作。下面将详细介绍Stream API的基本使用及其在...

    Java8ParallelStream:Java 8并行流示例

    Java 8是Java语言的一个重要版本,引入了许多新特性,其中并行...但同时,合理使用并行流也需要注意数据规模、线程安全和操作顺序等问题。通过深入理解和恰当应用并行流,我们可以在Java 8中构建出更加高效的应用程序。

    Java-Stream流详解.pptx.pptx

    Java Stream是Java 8引入的重要特性,它提供了一种声明式处理数据集合的方式,极大地提升了代码的可读性和性能。Stream允许程序员更加专注于业务逻辑,而不是底层数据处理的细节。 **1. Java Stream简介** Java ...

    jdk8,java 8,sdk,最后一个商业免费版本jdk-8u202-macosx-x64

    10. **ParallelGC和G1垃圾收集器优化**:Java 8对垃圾收集器进行了改进,尤其是Parallel GC和G1(Garbage First)GC,提升了应用程序的运行效率和内存管理。 总的来说,Java JDK 8是Java发展历程中的一个里程碑,它...

    java8中Stream的使用以及分割list案例

    Java8中的Stream使用和分割List案例 Java8中Stream的使用可以大大提高编程效率,代码简洁易懂。Stream api可以用来处理大规模的数据,提高性能。下面将详细介绍Java8中Stream的使用和分割List案例。 一、Stream的...

    java开发文档(jdk1.8中文版java8.zip

    8. **Parallel Collectors**:Java 8的集合框架扩展了并行流和并行收集器,可以自动利用多核处理器的性能优势,提高大规模数据处理的效率。 9. **Nashorn JavaScript引擎**:Java 8引入了一个新的JVM内置的...

    Java8中Stream使用的一个注意事项

    Java 8 中的 Stream 是一个强大的工具,它引入了一种新的数据处理方式,特别是对于集合对象的操作。Stream 不是存储数据的数据结构,而是用于处理数据的 API,它提供了丰富的操作,如过滤、映射、聚合等,使得代码...

    经典的Java8 JDK

    9. **Parallel Collectors**:在Java 8中,`java.util.Collections`的并发收集器进行了优化,可以更高效地进行并行数据处理,尤其是在多核处理器上。 10. **类型注解**:Java 8允许在类型声明处使用注解,如泛型...

    java8 JDK1.8 API 中文 有道翻译文档

    Stream API是Java 8中的另一大亮点,它提供了一种处理数据的新方式,类似于SQL查询,但适用于面向对象的环境。通过Stream,你可以对集合进行过滤、映射、减少等操作,支持并行处理,大大提高了代码的可读性和执行...

    Java高新技术8

    10. **并发容器与并发工具类**:ConcurrentHashMap、CopyOnWriteArrayList等并发容器和工具类如CountDownLatch、CyclicBarrier、Semaphore等,提供了线程安全的数据结构和协作机制,便于开发高并发程序。 11. **JVM...

    Java Tutorials for JDK 8(html版)

    Stream API支持序列和并行操作,可以方便地进行过滤、映射、收集等操作,极大地提高了代码的可读性和性能。例如,你可以通过一条语句就完成对集合数据的筛选和转换。 接口也得到了增强,现在可以包含默认方法和静态...

    Java8中的Stream流式操作教程之王者归来

    Java8还引入了并行流(Parallel Stream),通过多线程并行处理元素,从而提高性能。例如,`stream.parallel().forEach(System.out::println);` 使用并行流打印元素。 总的来说,Java8的Stream API极大地提升了处理...

    java八股文免费下载.zip

    - 数据类型:掌握基本数据类型和引用数据类型的使用。 - 运算符:了解各种运算符的优先级和作用。 - 流程控制:熟练运用if、switch、for、while等控制结构。 - 方法:掌握方法的定义、调用、重载和重写。 - ...

    jdk1.8,亲测可用 jdk sdk java

    9. **并发改进**:Java 8对并发库进行了优化,例如Fork/Join框架和Parallel Streams的性能提升,使得多线程编程更加高效。 10. **改进的编译器和JVM**:JDK 1.8的Javac编译器和JVM都有所增强,包括更快的编译速度和...

    Java 中的 Streams 面试问题

    可以通过调用从集合创建并行 Stream parallelStream()。这样做的好处是它可以通过利用多个执行线程来加速操作。然而,值得注意的是,并非所有任务都会从并行化中受益,在某些情况下,由于管理多个线程的开销,它甚至...

    java代码-Java 8 stream的简单使用

    在Java 8中,所有的集合接口都添加了`stream()`、`parallelStream()`方法,用于获取Stream实例。 1. 创建Stream - 通过集合的`stream()`或`parallelStream()`方法。 - 使用`Arrays.stream()`、`IntStream.range()...

    Java高新技术5

    线程同步机制如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)用于避免数据竞争和确保线程安全。 2. **Java内存模型和垃圾收集**:Java内存模型定义了线程如何访问和...

    oop-java-create-streams-OliverGrob:oop-java-create-streams-OliverGrob由GitHub Classroom创建

    - **并行流**:利用多线程并行处理,通过`.parallelStream()`获得,适合大数据量处理,但需要注意线程安全问题。 - **顺序流**:单线程执行,通过`.stream()`获得,适合小数据量或需要保持执行顺序的情况。 6. **...

Global site tag (gtag.js) - Google Analytics