inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

채널톡 면접관이 직접 알려주는 CS 면접 대비 - Java 편

(꼬리 질문) Java 8에서 람다와 스트림을 도입한 이유가 가독성 때문만일까요? ⭐️⭐️⭐️

멀티스레드

해결된 질문

81

Cola

작성한 질문수 42

1

람다와 스트림이 순수 함수를 강제하지 않는데

멀티스레드 환경에 안전하다는 게 어떻게 안전한건지 궁금합니다.

java 객체지향 computer-science

답변 2

1

JSCODE 제이온

안녕하세요, Cola님!

 

람다와 스트림이 멀티스레드 환경에 안전하다는 건 "순수 함수로 사용한다는 전제 아래" 안전하다는 의미예요.

스트림 API는 각 연산이 stateless하고 부수효과를 일으키지 않는다는 것을 전제로 설계되어 있습니다. 이 전제만 지키면 parallelStream()으로 병렬 처리해도 race condition 없이 안전하게 동작합니다. Java 공식 문서에서도 스트림 연산은 stateless해야 한다고 명시되어 있고요.

 

말씀하신 대로 람다 내부에서 외부 변수를 수정하거나 공유 상태에 부수효과를 일으키면 당연히 안전하지 않습니다. 다만 이 경우는 스트림이 안전하지 않은 게 아니라, 함수형 프로그래밍의 설계 원칙을 사용자가 깬 것이라고 보시는 게 맞아요. 자료에서 "안전하다"고 한 건 의도된 사용 방식, 즉 순수 함수로 작성하는 경우를 전제한 표현입니다.

 

면접에서는 "스트림은 stateless한 순수 함수로 작성하는 것을 전제로 설계되어 있어서, 이 약속만 지키면 parallelStream()에서도 안전하게 동작합니다. 부수효과가 있는 람다를 쓰면 그건 함수형 원칙을 깬 것이지 스트림의 한계는 아닙니다" 정도로 답변하시면 됩니다.

1

Cola

이해했습니다 감사합니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. Cola님!

람다와 스트림이 멀티스레드 환경에서 안전한 이유를 이해하기 위해선 몇 가지 개념을 살펴볼 필요가 있습니다. 이들은 Concurrent Stream을 통한 멀티스레드 처리를 사용할 경우에 주로 해당됩니다.

  1. Immutable State: 스트림과 람다를 사용할 때, 일반적으로 함수형 프로그래밍 스타일이 도입되므로 변경 불가능한 상태(immutable state)를 유지하게 됩니다. 이렇게 되면 여러 스레드가 동시에 데이터를 읽어도 문제가 발생하지 않습니다.

  2. Stateless Functions: 스트림에서 사용되는 람다 표현식은 일반적으로 무상태(stateless)로 작성됩니다. 즉, 그 함수들이 외부의 변수를 변경하지 않으므로, 스레드 간의 경쟁 조건(race condition)을 피할 수 있습니다.

  3. Parallel Stream: Java 8부터 제공되는 parallelStream() 메소드는 내부적으로 ForkJoinPool을 사용하여 병렬 처리 환경을 구성하므로 멀티스레드 안전성을 보장합니다. 이것은 스트림 연산이 분리된 스레드 내에서 작동하면서도 공유된 상태를 변경하지 않기 때문에 가능합니다.

위의 개념들이 결합되어 스트림과 람다가 멀티스레드 환경에서 안전성을 어느 정도 보장할 수 있게 하는 것입니다. 다만, 이들이 순수 함수(pure function)를 강제하는 것은 아니기 때문에, 작성하는 코드는 항상 스레드 안전하지 않을 수 있습니다. 개인의 주의가 필요합니다.

관련된 유사 질문에 대한 답변들을 참고하시려면 다음 링크들을 확인해 보세요:
- Java 스트림과 병렬 처리의 안전성

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

[영한님]Spring Boot 및 프로젝트 생성

0

13

1

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

36

1

리뉴얼 시기

0

9

1

스크립트에 대해 질문 있습니다.

1

26

1

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

24

1

조건 검색 질문

0

24

1

JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문

0

35

2

수동으로 계산하기 부분에서 질문

0

22

1

ALU 강의에서 질문

0

28

2

클로드코드 명령어-대화&세션관리 수업 자료

0

32

1

정처기 필기 준비할때 이 이론을 다시 외워도 될까요?

0

46

2

PlatformTransactionManager, ResourcelessTransactionManager 질문

1

51

2

자료 한번에 다운받기

0

28

1

비관적 락과 낙관적 락에서 임계 영역 질문 있습니다.

0

36

2

스프링 빈 등록 방법 2가지 다 알아야하는 이유

0

49

1

mybatis 를 이용한 crud에서 insert에서 resultType='long" 이라고 하셨는데요,

0

24

1

질문있습니다.

1

85

2

성능 오버헤드

1

79

2

volatile에 대해 질문 있습니다.

2

114

2

Mark and Sweep

1

81

1

GC 알고리즘

1

83

2

용어 질문

1

56

1

호출횟수 질문입니다.

1

85

2

실행과정 질문입니다.

2

76

1