목차
자바의 동시성 프로그래밍이란
스트림이란
스트림 병렬처리란
동시성 프로그래밍이란, 싱글 프로세서에서 멀티 스레드를 동작시키는 것이다. 스레드를 바꿀 때는 관련 정보를 읽어오느라 시간과 비용이 발생한다(Context Switching). 이걸 최소화하는 게 중요하다.
자바는 동시성 프로그래밍 관련해서 여러 기능을 지원한다.
- 스레드, 동기화, wait/notify
- 포크 조인 패키지
- 스트림 파이프라인의 parallel
동시성 프로그래밍을 적용한다고 해서 무조건 성능이 좋아지는 것은 아니다. 성능이 좋아질 수 있는 경우를 파악해야 하며, 동시성 프로그래밍을 적용한 후에도 성능 테스트를 수행해서 검사해야 한다.
스트림 예시를 보면 감이 온다.
Stream.iterate(1L ,i -> i + 1)
.limit(n)
.parallel()
.reduce(0L, Long::sum);
스트림은 병렬화 기능을 지원한다. 앞서 말했듯이 병렬화를 적용한다고 해서 무조건 성능이 좋아지는 것은 아니다. 심지어 결과가 잘못되거나 오동작할 수도 있다(safety failure). 병렬화를 적용하기 전에 이러한 케이스에 대해 잘 알아둬야 한다.
스트림 병렬화는 (1) 연산을 쪼개서 수행한 후 (2) 합치는 방식으로 진행된다. 그래서 동작 방식이 종단인 연산에 대해서 성능이 좋아진다.
ex) min, max, count, sum
자료구조 중에 데이터가 메모리에 연속되어 저장된 경우 성능이 좋아진다. (참조 지역성이 뛰어난 자료구조를 써야 한다)
ex) ArrayList, HashMap, HashSet, ConcurrentHashMap