MST

星途 面试题库

面试题:Java中并行流可能出现线程安全问题的场景

在Java Stream并行流的使用中,列举至少两种可能会出现线程安全问题的场景,并简要说明原因。
12.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 共享可变状态
    • 场景:在并行流操作中,若流处理的元素操作涉及对共享可变变量(如普通的ArrayList等非线程安全集合)的修改。例如,在forEach操作中直接向一个共享的ArrayList添加元素。
    • 原因:并行流会并行处理元素,多个线程同时对共享可变变量进行操作,可能导致数据竞争。比如一个线程刚读取了共享变量的值准备修改,另一个线程同时也读取了相同的值,随后两个线程分别基于这个值进行修改,最终结果可能并非预期,因为一个线程的修改会被另一个线程覆盖。
  2. 依赖于先前操作结果的操作
    • 场景:在并行流中进行累加操作,例如使用reduce方法,并且累加操作依赖于之前的计算结果,同时又没有使用线程安全的累加方式。如简单地使用一个普通变量累加流中的元素。
    • 原因:并行流并行执行各个部分的计算,多个线程可能同时进行累加操作,由于线程执行顺序不确定,可能导致最终累加结果错误。因为不同线程可能同时基于旧的累加值进行新的计算,而不是基于前一个线程正确累加后的结果。