Java 8之二小坑:stream parallel 和 lamada
2016-04-14 18:17
761 查看
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 开发的方向
- java中的BigDecimal和String的相互转换
- 深入理解JAVA虚拟机--Idea远程执行本地Java代码
- Java web开发学习
- Spring+SpringMVC+MyBaties问题总结(一)
- spring+springMVC+mybatis的框架项目基础环境搭建
- JAVA反射实现一个拦截器(Interceptor)
- 简述JDK,JRE的区别
- 在Eclipse下运行Heritrix3.2.0(环境windows10 64位)
- springMVC常用注解
- springMVC入门
- Java内部类:成员内部类(二)
- JAVA事务的概念
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- struts2注解使用拦截器interceptor和interceptor-stack
- MyEclipse默认编码为GBK,修改为UTF8的方法
- Java基础之获取Class对象的三种方式
- Java进阶学习第四天——DOM入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- Java线程池的分析和使用