코딩마을방범대

순차 & 병렬 & 병행 처리의 차이점과 Java의 stream & parallelStream 본문

💡 백엔드/Java

순차 & 병렬 & 병행 처리의 차이점과 Java의 stream & parallelStream

신짱구 5세 2023. 8. 1. 16:13
728x90

 

 

순차 & 병렬 & 병행 처리의 차이점

 

순차 처리 ( Sequential ) 여러 작업을 순서대로 하나씩 처리
병렬 처리 ( Parallel ) 여러 작업을 동시에 처리
병행 처리 ( Concurrent ) 한 개의 업무를 어떠한 순서로 처리하든 상관없는 여러 개의 작업으로 분할하여 처리
※ 멀티쓰레드 프로그램의 경우 병행 처리를 의미함
만약 CPU가 한 개라면 순차적으로, 여러개라면 병렬적으로 실행한다.

CPU가 하나라면 복수의 쓰레드가 작동하고 있다 하더라도 여러 개의 작업으로 분할하여 순차적으로 실행한다.
즉, 동일한 시간 대에 실행되는 쓰레드는 오직 하나이지만, 
여러 개의 쓰레드가 무작위로 번갈아가면서 실행됨으로써 결과적으로 동시에 처리되는 것처럼 보인다.
ex ) 쓰레드 1 실행 -> 쓰레드 2 실행 -> 쓰레드 1 실행 -> 쓰레드 2 실행

 

 

※ 병행과 병렬의 차이

 

 

 


 

 

 

 

 

Stream

 

Java 8에 추가된 스트림은 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능이다.

Stream을 사용하면 불필요한 for문을 사용하지 않을 수 있고, 람다식을 활용할 수 있어 코드를 직관적이게 처리할 수 있다.

 

 

특징

  1. 데이터를 담는 저장소는 아니다.
  2. 데이터를 변경하지 않는다.
  3. 재사용할 수 없다.
  4. 각 요소가 1번씩 처리된다.

 


 

 

Stream API는 데이터.Stream생성().중개연산()...종료연산() 구조로 사용한다.

중개연산 종료 연산
  • 계속 연산을 추가할 수 있다. 
  • Stream을 리턴한다. 
  • Lazy (종료 연산이 오기 전에는 실행하지 않음) 
  • Stateless / Stateful 오퍼레이션으로 구분할 수 있다. 
    (sorted의 경우 Stateful. 이전 데이터를 참조하기 때문) 
  • filter, map, limit, skip, sorted ...
  • 더 이상 연산을 연결할 수 없다.
  • Stream을 리턴하지 않는다.
  • collect, allMatch, count, forEach, min, max, ...
Lazy
바로 실행하지 않고 미루다가 필요한 순간 그 때 어떠한 행위를 하겠다는 의미
ex ) 무한스크롤

Lazy Initialization
객체를 필요할 때 만들겠다는 뜻

Stateful             : 세션이 종료될 때까지, 클라이언트의 세션 정보를 저장하는 네트워크 프로토콜
Stateless          :
서버가 클라이언트의 세션 상태 및 세션 정보를 저장하지 않는 네트워크 프로토콜

 

 

 


 

 

 

ParallelStream

 

Stream과 하는 일은 동일하지만 데이터를 병렬로 처리하기 때문에 대용량 데이터의 경우에 적합하다.

 

다만, ParallelStream 마다 별도의 Thread pool을 사용하는게 아니라, 

Thread pool 1개를 프로그램의 모든 ParallelStream이 공유하는 구조라서 병목 현상이 발생할 수 있다.

병목(bottleneck) 현상
전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상

 

 

 

 

 

 


참고사이트

순차(sequential) / 병렬(parallel) / 병행(concurrent) 처리방식 차이

Java 8 - Stream이란? (+ ParallelStream)

 

 

 

728x90