Stream:parallel乱序

Java 8 stream流为处理集合时非常方便。遇到的一个坑是为了提高在多核cpu下的性能,尝试了parallel()。数据源是HashSet的,在做分割的时候发现每次跟串行的结果都不一样。

解决方式:

  • 后来改为有序的LinkedHashSet再使用parallel。
  • 去掉parallel,让stream串行执行

lamada:

如下代码:

public static void main(String[] args) throws Exception {
testHashCode(() -> {});
testHashCode(() -> {});
} private static void testHashCode(Runnable runnable) {
System.out.println(runnable.hashCode());
}

结果发现两个输出的hashCode是不一样的,因此可以确定两次调用的runnable不是一个对象,即可以理解为:

() -> {}

等价于

new Runnable() {
public void run() {...}
}

实例化对象是有代价的,如果频繁实例化会加剧YGC,所以在QPS比较高的请求中需要注意这点,因为不像直接用new这种实例化方式一样很明显发现问题。现有项目中基本很多这样的代码,是可以优化的。可以搞个单例。

除了上面需要注意的这点,lamada表达式还有2个问题:

  • 极度简化了代码的同时也导致了逻辑层次显得不那么清晰
  • 增加了异常的堆栈深度

Java 8之二小坑:stream parallel 和 lamada的更多相关文章

  1. Java 8新特性之Stream(八恶人-3)

    “You John Ruth The Hangman” 绞刑者鲁斯·约翰 “When the Hangman catches you, you hang.”当被绞刑者抓住了,你肯定会被绞死 一.基本介 ...

  2. list.stream().parallel() 并行流

    https://blog.csdn.net/u011001723/article/details/52794455/  :  parallel()其实就是一个并行执行的流.它通过默认的ForkJoin ...

  3. Java中的文件和stream流的操作代码

    1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;clas ...

  4. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

  5. 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云

    一.粉丝的反馈 问:stream比for循环慢5倍,用这个是为了啥? 答:互联网是一个新闻泛滥的时代,三人成虎,以假乱真的事情时候发生.作为一个技术开发者,要自己去动手去做,不要人云亦云. 的确,这位 ...

  6. Atitit 实现java的linq 以及与stream api的比较

    Atitit 实现java的linq 以及与stream api的比较 1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1. ...

  7. Java 8 Lambda 表达式及 Stream 在集合中的用法

    简介 虽然 Java 8 已经发布有一段时间了,但是关于 Java 8 中的 Lambda 表达式最近才开始系统的学习,刚开始就被 Stream 的各种骚操作深深的吸引住了,简直漂亮的不像 Java. ...

  8. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...

  9. Stream parallel并行流的思考

    1.并行流并不一定能提高效率,就和多线程并不能提高线程的效率一样 因为引入并行流会引起额外的开销,就像线程的频繁上下文切换会导致额外的性能开销一样,当数据在多个cpu中的处理时间小于内核之间的传输时间 ...

随机推荐

  1. 2016网络大事记 mark

    记录2016年每天的大事件. 2016年01月07日     快播庭审.辩护人各种出彩. 2016年01月09日     乐视多个贴吧被爆.百度出面平息. 2016年01月10日     斗鱼TV造人 ...

  2. UCenter创始人密码正确但是登录不了

    UCenter创始人密码正确但是登录不了,没有什么提示,就反复输入密码登录 也进不了......... ================================================ ...

  3. 微信小程序之本地缓存(十)

    [未经作者本人同意,请勿以任何形式转载] 目前,微信给每个小程序提供了10M的本地缓存空间(哎哟妈呀好大) 有了本地缓存,你的小程序可以做到: 离线应用(已测试在无网络的情况下,可以操作缓存数据) 流 ...

  4. 2016年iOS笔试题

    收集了一些ios面试的一些基础的试题,其中也有一些较难的 1.请简述UIView与CALayer有什么不同.2.Block什么情况下会保留实体内引用到外部对象,什么时候要用__block或__weak ...

  5. swift上传头像

    很久没有写博客了,今天特地写了这个,也是一边仿照别人写的demo,注释部分都是需要的.需要的同学可以参考一下. @IBAction func headImageBtnPage(){  //上传头像 / ...

  6. JavaScript模板引擎artTemplate.js——template.compile()方法

    template.compile(source, options) source:必传,渲染模板的内容. options:可选,通常不传.(其实是我还没研究明白) return:一个渲染函数. 示例如 ...

  7. CCF 201604-4 游戏

    /* 广度优先搜索 左右两个方向 node{x,y,step} 到了就返回step,不到就检查左右两边符合条件就入队. 用一个结构体保存 危险时间 time[i][j]{beg,time} beg=e ...

  8. python re 模块和基础正则表达式

    1.迭代器:对象在其内部实现了iter(),__iter__()方法,可以用next方法实现自我遍历. 二.python正则表达式 1.python通过re模块支持正则表达式 2.查看当前系统有哪些p ...

  9. Android Studio导入第三方jar包

    直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖.如下: dependencies { compile fileTree(dir: 'libs', ...

  10. 使用gulp-connect实现web服务器

    安装插件安装gulp-connect插件,安装命令如下 npm install --save-dev gulp-connect 定义web服务,gulpfile.js代码 var gulp = req ...