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并行处理的优势。
分享到:
相关推荐
Java 8 的 `parallelStream` 是为了解决大数据量处理时的性能问题,它通过多线程并行处理数据流,极大地提升了效率。然而,正如标题和描述中指出的,`parallelStream` 并不保证线程安全。这意味着在并发操作中,如果...
其中,Stream API是Java 8中最显著的新特性之一,它为处理集合数据提供了全新的方式。Stream API使得我们能够以声明式的方式处理数据,非常适合进行并行计算和大数据操作。下面将详细介绍Stream API的基本使用及其在...
Java 8是Java语言的一个重要版本,引入了许多新特性,其中并行...但同时,合理使用并行流也需要注意数据规模、线程安全和操作顺序等问题。通过深入理解和恰当应用并行流,我们可以在Java 8中构建出更加高效的应用程序。
Java Stream是Java 8引入的重要特性,它提供了一种声明式处理数据集合的方式,极大地提升了代码的可读性和性能。Stream允许程序员更加专注于业务逻辑,而不是底层数据处理的细节。 **1. Java Stream简介** Java ...
10. **ParallelGC和G1垃圾收集器优化**:Java 8对垃圾收集器进行了改进,尤其是Parallel GC和G1(Garbage First)GC,提升了应用程序的运行效率和内存管理。 总的来说,Java JDK 8是Java发展历程中的一个里程碑,它...
Java8中的Stream使用和分割List案例 Java8中Stream的使用可以大大提高编程效率,代码简洁易懂。Stream api可以用来处理大规模的数据,提高性能。下面将详细介绍Java8中Stream的使用和分割List案例。 一、Stream的...
8. **Parallel Collectors**:Java 8的集合框架扩展了并行流和并行收集器,可以自动利用多核处理器的性能优势,提高大规模数据处理的效率。 9. **Nashorn JavaScript引擎**:Java 8引入了一个新的JVM内置的...
Java 8 中的 Stream 是一个强大的工具,它引入了一种新的数据处理方式,特别是对于集合对象的操作。Stream 不是存储数据的数据结构,而是用于处理数据的 API,它提供了丰富的操作,如过滤、映射、聚合等,使得代码...
9. **Parallel Collectors**:在Java 8中,`java.util.Collections`的并发收集器进行了优化,可以更高效地进行并行数据处理,尤其是在多核处理器上。 10. **类型注解**:Java 8允许在类型声明处使用注解,如泛型...
Stream API是Java 8中的另一大亮点,它提供了一种处理数据的新方式,类似于SQL查询,但适用于面向对象的环境。通过Stream,你可以对集合进行过滤、映射、减少等操作,支持并行处理,大大提高了代码的可读性和执行...
10. **并发容器与并发工具类**:ConcurrentHashMap、CopyOnWriteArrayList等并发容器和工具类如CountDownLatch、CyclicBarrier、Semaphore等,提供了线程安全的数据结构和协作机制,便于开发高并发程序。 11. **JVM...
Stream API支持序列和并行操作,可以方便地进行过滤、映射、收集等操作,极大地提高了代码的可读性和性能。例如,你可以通过一条语句就完成对集合数据的筛选和转换。 接口也得到了增强,现在可以包含默认方法和静态...
Java8还引入了并行流(Parallel Stream),通过多线程并行处理元素,从而提高性能。例如,`stream.parallel().forEach(System.out::println);` 使用并行流打印元素。 总的来说,Java8的Stream API极大地提升了处理...
- 数据类型:掌握基本数据类型和引用数据类型的使用。 - 运算符:了解各种运算符的优先级和作用。 - 流程控制:熟练运用if、switch、for、while等控制结构。 - 方法:掌握方法的定义、调用、重载和重写。 - ...
9. **并发改进**:Java 8对并发库进行了优化,例如Fork/Join框架和Parallel Streams的性能提升,使得多线程编程更加高效。 10. **改进的编译器和JVM**:JDK 1.8的Javac编译器和JVM都有所增强,包括更快的编译速度和...
可以通过调用从集合创建并行 Stream parallelStream()。这样做的好处是它可以通过利用多个执行线程来加速操作。然而,值得注意的是,并非所有任务都会从并行化中受益,在某些情况下,由于管理多个线程的开销,它甚至...
在Java 8中,所有的集合接口都添加了`stream()`、`parallelStream()`方法,用于获取Stream实例。 1. 创建Stream - 通过集合的`stream()`或`parallelStream()`方法。 - 使用`Arrays.stream()`、`IntStream.range()...
线程同步机制如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)用于避免数据竞争和确保线程安全。 2. **Java内存模型和垃圾收集**:Java内存模型定义了线程如何访问和...
- **并行流**:利用多线程并行处理,通过`.parallelStream()`获得,适合大数据量处理,但需要注意线程安全问题。 - **顺序流**:单线程执行,通过`.stream()`获得,适合小数据量或需要保持执行顺序的情况。 6. **...