lambda식에서는 외부지역변수를 사용할땐 final이거나 effectively final 해야한다.
lambda식도 함수이니 실행되는 함수와 외부지역변수를 가진 함수와 다른 쓰레드에서 동작할 가능성이 있다.
이 때 두 쓰레드 사이에 외부지역변수에 대해 완벽하게 sync를 잡아줄 방법이 없다.
lambda식 입력이 같다면 그 결과도 같아야만한다.(순수함수)
일단 둘 사이의 쓰레드가 다를 때 외부지역변수의 데이터를 가진 쓰레드가 먼저 끝나 데이터가 사라질 수 있다.
그렇기에 lambda식에서는 변수를 복사하여 사용한다. (람다 캡쳐링)
(클래스 변수, 인스턴스 변수는 공유 자원이니 접근 가능)
즉, 멀티쓰레딩 환경에서 정상적인 결과를 보장하기 힘들어 외부지역변수를 복사하여 사용한다.
그리고 이 복사한 값에도 변화를 주지 못하게 하는데
이는 복사한 값이 최신값이길 보장하기 위하여 lambda를 설계하였는데 이 값에 변형을 준다는 건
이러한 논리에 잘 맞지 않기 때문이다.
다시말해 멀티쓰레딩 환경에서 동시성 문제를 해결하기 위해 고려된 부분이다.
'언어와 프레임워크 > Java' 카테고리의 다른 글
빠르게 살펴보는 코틀린 문법 (0) | 2023.09.25 |
---|---|
[Java] lazy evaluation(short circuit, loop fusion), Stream API (0) | 2023.07.26 |
[JAVA] Intellij JDK 한글 깨짐 (Open JDK18 이전, 이후 나눔) (1) | 2022.07.14 |
[JAVA] java 입장에서 call by value와 call by reference의 짧은 고찰. (0) | 2022.06.26 |
[JAVA] 클래스 메서드와 인스턴스 메서드 (0) | 2022.06.25 |
댓글