parallelStream() 线程安全完美解决方案,求大神批评

java 8 parallelStream()多管道的使用初试牛刀

  1. parallelStream()也有人叫它并行流,都是同样的概念,多线程。
  2. 既然是多线程,那么它一定有线程安全问题,那么要怎么控制呢?废话少说,一起来看下吧!
  3. 背景:遍历集合时候使用parallelStream()会比stream()快很多,但是我们写个demo,你就会发现,数据丢失了。。。
  • 上代码:
//创建集合大小为100
 List integers = Lists.newArrayList();
       for (int i = 0; i < 100; i++){
           integers.add(i);
       }
//多管道遍历
       List integerList = Lists.newArrayList();
       integers.parallelStream().forEach(e -> {
              //添加list的方法
              setInteger(integerList, e);
               try {
               	//休眠100ms,假装执行某些任务
                   Thread.sleep(100);
               } catch (InterruptedException e1) {
                   e1.printStackTrace();
               }
        });

private static void setInteger(List integerList, Integer e) {

       integerList.add(e);

   }
  • 以上代码你会发现,执行完了integerList的大小和预期的不一样,这是为什么呢?个人理解就是没有锁造成的,很简单,在setInteger()方法上加个修饰synchronized就ok了
// 加synchronized修饰的方法是线程安全的,某一线程在执行这个方法的时候,其他线程只能眼巴巴看着;
 private static synchronized void setInteger(List integerList, Integer e) {

        integerList.add(e);

    }

你可能感兴趣的:(parallelStream() 线程安全完美解决方案,求大神批评)