Java8 遍历List 使用stream().parallel()并发安全

1. parallelStream是什么:

复制代码
 java 8引入了并行流的概念来进行并行处理,而并行流(Parallel Stream)利用所有可用CPU内核的优势,并行处理任务。其原理(Parallel Stream)是可以把大任务分成多个小任务执行, 最后再把执行结果进行合并, ForkJoinPool用工作窃取算法实现。

2.Java8的paralleStream是线程安全吗

复制代码
    一个简单例子,循环1000000次,往list中插入数据,最后看list的长度。
javascript 复制代码
public class TestParallel {
    public static void main(String[] args) {
        StopWatch stopWatch = new StopWatch();
        List<Integer> list = new ArrayList<>();
        stopWatch.start("TaskOneName");
        IntStream.range(0, 1000000).forEach(list::add);
        stopWatch.stop();
        System.out.println("list size:" + list.size());
        System.out.println("当前任务名称:" + stopWatch.currentTaskName() +" 执行时间:" + stopWatch.getTotalTimeMillis());
 
    }
}

执行时间以及list 中的size见下图

使用并发流

javascript 复制代码
public class TestParallel {
   public static void main(String[] args) {
       StopWatch stopWatch = new StopWatch();
       List<Integer> list = new ArrayList<>();
       stopWatch.start("TaskOneName");
       IntStream.range(0, 10000).parallel().forEach(list::add);
       stopWatch.stop();
       System.out.println("list size:" + list.size());
       System.out.println("当前任务名称:" + stopWatch.currentTaskName() +" 执行时间:" + stopWatch.getTotalTimeMillis());

   }
}

执行情况一:

执行情况二:

从上图可看出,list的add操作并非我们想要的结果。

3.如果非要用并行流怎么办

加锁吧。

javascript 复制代码
public class TestParallel {
    public static void main(String[] args) {
        StopWatch stopWatch = new StopWatch();
        List<Integer> list = new ArrayList<>();
        stopWatch.start("TaskOneName");
         Lock lock = new ReentrantLock();
        IntStream.range(0, 10000).parallel().forEach(adata->{
            lock.lock();
            try {
                list.add(adata);
            }finally {
                lock.unlock();
            }
        });
        stopWatch.stop();
        System.out.println("list size:" + list.size());
        System.out.println("当前任务名称:" + stopWatch.currentTaskName() +" 执行时间:" + stopWatch.getTotalTimeMillis());
 
    }
}

执行结果:

4.使用线程安全的ArrayList:

使用线程安全的ArrayList: CopyOnWriteArrayList

相关推荐
zx_zx_1234 分钟前
定长滑动窗口和不定长滑动窗口
数据结构·算法
oyzz12020 分钟前
Windows 上彻底卸载 Node.js
windows·node.js
闭关苦炼内功38 分钟前
Win10 安装 MySQL5.7.36 数据库记录
数据库·windows·mysql
自信150413057591 小时前
选择排序算法
c语言·数据结构·算法·排序算法
仰泳的熊猫1 小时前
题目2580:蓝桥杯2020年第十一届省赛真题-分类计数
数据结构·c++·算法·蓝桥杯
qyzm1 小时前
牛客周赛 Round 136
数据结构·python·算法
Magic--1 小时前
从入门到精通:快速排序的核心原理、实现与优化
数据结构·算法·排序算法
weixin_649555671 小时前
C语言程序设计第四版(何钦铭、颜晖)第十章函数与程序结构之统计完全平方数
c语言·数据结构·算法
斯密码赛我是美女1 小时前
周报(欢乐赛+信息搜集ctfshow+Trae-mcp)
网络·windows
Magic--1 小时前
选择排序:原理、实现与优化
数据结构·算法·排序算法