7장_아이템48 - ririkat/effective-java GitHub Wiki

아이템 48. 스트림 병렬화는 주의해서 적용하라

자바 8부터는 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했다.

이처럼 동시성 프로그램을 작성하기가 점점 쉬워지고는 있지만, 이를 올바르고 빠르게 작성하는 일은 여전히 어려운 작업이다.

  • 동시성 프로그램 & 병렬 스트림 파이프라인 프로그래밍 시 체크포인트

    • 안정성
    • 응답 가능 상태 유지
  • 환경이 아무리 좋더라도 데이터 소스가 Stream.iterate거나 중간 연산으로 limit를 쓰면 파이프라인 병렬화로는 성능 개선을 기대할 수 없다.

  • 스트림 파이프라인을 마구잡이로 병렬화하면 안 된다.

    • 오히려 성능이 끔찍하게 나빠질 수도 있기 때문
  • 스트림 병렬화의 효과가 좋은 경우

    • 스트림의 소스가 ArrayList , HashMap , HashSet , ConcurrentHashMap 의 인스턴스거나 배열 , int 범위 , long 범위 인 경우
      • 이 자료구조들은 모두 데이터를 원하는 크기로 나눌 수 있어서, 다수의 스레드에 일을 분배하기 좋음

        • 나누는 작업은 Spliterator 가 담당
          • Stream 이나 Iterablespliterator 메서드로 얻어올 수 있음.
      • 이 자료구조들은 원소들을 순차적으로 실행할 때의 참조 지역성 이 뛰어나다.

        • 참조 지역성은 벌크 연산을 병렬화할 때 아주 중요한 요소로 작용

        ......

  • 핵심 정리

    • 스트림을 잘못 병렬화하면 프로그램을 오동작하게 하거나 성능을 급격히 떨어뜨린다.
    • 병렬화를 사용하려면, 운영 환경과 유사한 조건에서 수행해보며 성능지표를 유심히 관찰하라.
    • 계산, 성능에 대한 확신이 들 때만 병렬화 버전 코드를 운영 코드에 반영하라.