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个问题:
- 极度简化了代码的同时也导致了逻辑层次显得不那么清晰
- 增加了异常的堆栈深度