본문 바로가기
언어와 프레임워크/Java

[Java] effectively final, lambda

by Unagi_zoso 2023. 7. 25.

lambda식에서는 외부지역변수를 사용할땐 final이거나 effectively final 해야한다.
lambda식도 함수이니 실행되는 함수와 외부지역변수를 가진 함수와 다른 쓰레드에서 동작할 가능성이 있다.
이 때 두 쓰레드 사이에 외부지역변수에 대해 완벽하게 sync를 잡아줄 방법이 없다
 lambda식 입력이 같다면 그 결과도 같아야만한다.(순수함수)

일단 둘 사이의 쓰레드가 다를 때 외부지역변수의 데이터를 가진 쓰레드가 먼저 끝나 데이터가 사라질 수 있다.
그렇기에 lambda식에서는 변수를 복사하여 사용한다. (람다 캡쳐링)
(클래스 변수, 인스턴스 변수는 공유 자원이니 접근 가능)
 
즉, 멀티쓰레딩 환경에서 정상적인 결과를 보장하기 힘들어 외부지역변수를 복사하여 사용한다.
 
그리고 이 복사한 값에도 변화를 주지 못하게 하는데 
이는 복사한 값이 최신값이길 보장하기 위하여 lambda를 설계하였는데 이 값에 변형을 준다는 건
이러한 논리에 잘 맞지 않기 때문이다.
 
다시말해 멀티쓰레딩 환경에서 동시성 문제를 해결하기 위해 고려된 부분이다.
 

댓글