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个问题:

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

相关文章:

  • 2021-12-26
  • 2021-05-15
  • 2021-09-27
  • 2021-11-25
  • 2022-01-20
  • 2022-01-15
  • 2021-05-31
  • 2021-09-19
猜你喜欢
  • 2022-01-10
  • 2022-01-19
  • 2022-12-23
  • 2021-06-09
  • 2021-12-07
相关资源
相似解决方案