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

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

  1. parallelStream()也有人叫它并行流,都是同样的概念,多线程。
  2. 既然是多线程,那么它一定有线程安全问题,那么要怎么控制呢?废话少说,一起来看下吧!
  3. 背景:遍历集合时候使用parallelStream()会比stream()快很多,但是我们写个demo,你就会发现,数据丢失了。。。
  • 上代码:
//创建集合大小为100
 List<Integer> integers = Lists.newArrayList();
       for (int i = 0; i < 100; i++){
           integers.add(i);
       }
//多管道遍历
       List<Integer> 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<Integer> integerList, Integer e) {

       integerList.add(e);

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

        integerList.add(e);

    }
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值