TIL/Java & Spring Boot

병렬 스트림

삼공비 2024. 6. 2. 12:21

병렬처리란?

  • 여러 개의 작업을 동시에 수행해서 전체 처리 시간을 단축하는 방법을 말한다
  • 주로 멀티코어 프로세서를 활용하여 하나의 작업을 여러 부분으로 나누고 나눈 부분을 동시에 처리하는 방식이다
  • 자바에서는 주로 java.util.stream 패키지의 parallel stream이나 java.util.concurrent 패키지의 여러 클래스나 인터페이스를 사용해서 구현한다

장점

  • 성능 향상
    • 여러 코어를 사용해서 순차적 처리보다 더 빠르게 완료할 수 있다
    • 대량의 데이터나 복잡한 계산을 처리할 때 좋다
  • 효율적인 자원 활용
    • 모든 코어를 효율적으로 사용해서 시스템 자원을 최대한 활용할 수 있다
    • 단일 코어에서 작업이 병목 현상을 일으키는 걸 방지한다
  • 응답 시간 단축
    • 병렬 처리로 작업을 나누어 동시에 처리하면 작업의 응답 시간이 줄어든다
  • 스케일링 용이성
    • 프로세서나 코어가 더 있으면 작업을 더 분산해서 처리할 수 있다

Java에서 병렬 처리 구현

  • 병렬 스트림
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    

// 순차 스트림
List sequentialResult = numbers.stream()
.map(n -> n * n)
.toList();

// 병렬 스트림
List parrellResult = numbers.parallelStream()
.map(n -> n * n)
.toList();

```

병렬 처리 시 주의점

  • 스레드 안정성
    • 여러 스레드가 사용되기 때문에 공유 자원의 스레드 안정성을 보장해야 한다
  • 오버헤드
    • 병렬 처리가 항상 성능 향상을 보장하지 않는다
    • 작업을 분할하고 병합하면서 오버헤드가 발생할 수 있고 작은 작업에서는 오히려 성능이 저하될 수 있다
  • 데드락
  • 작업 분할
    • 균등하게 작업을 분할해야 전체 성능 저하를 피할 수 있다