자바 플랫폼에서 경량 동시성을 보장하는 새로운 프로그래밍 모델 지원 프로젝트
https://wiki.openjdk.java.net/display/loom/Main
프로젝트 구성
1. Virtual threads
2. Delimited continuations
3. Tail-call elimination
출처
http://gunsdevlog.blogspot.com/2020/09/java-project-loom-reactive-streams.html
http://guruma.github.io/posts/2018-09-27-Project-Loom-Fiber-And-Continuation/
https://developers.redhat.com/blog/2019/06/19/project-loom-lightweight-java-threads/
자바는 OS 스레드를 직접적으로 사용하지만 동시에 수천개의 요청을 효율적으로 처리하기 쉽지 않았음
그래서 나온 것들이 비동기 라이브러리, 하지만 자바의 스레드는 성능면에서 효율적이지 못했음
Loom의 목표는 경량 스레드를 어플리케이션 개발자들에게 제공하여 동기 블로킹 코드를 마음껏 이용하는데 있음
자바 MVC 스택은 기본적으로 쓰레드 풀, 즉 요청 하나당 하나의 스레드를 사용 (블로킹 방식)
그래서 많은 스레드를 사용하게 되고 이는 컨텍스 스위칭 비용을 유발
뿐만아니라 데르락, 스레드 누수 등의 문제 존재
반면, 비동기 프로그래밍은 적은 수의 스레드로 여러 요청을 처리, 자바의 동시성을 활용한 프로그래밍
동기함수에서는 비동기 함수 호출 불가
비동기에서 블록킹 IO 함수 호출에 신경써야 함 -> 적절한 스케줄링 필요
여전히 전염성이 있고 컨텍스트를 잃음
쓰레드가 블로킹 코드를 내부적으로 논블로킹으로 동작하게 하는 방식 사용
경량 쓰레드는 Continuations과 Schduler로 조합
Continuations : IO작업을 만나면 사용하던 쓰레드는 반납하고 현재 일한 상태로 있음, 나중에 호출되면 다시 그 시점부터 일함
Schduler : 스레드를 할당해줘서 잠시 멈춘 상태에서 다시 일을 하게 만듬
참조 : http://guruma.github.io/posts/2018-09-27-Project-Loom-Fiber-And-Continuation/
java는 커널 쓰레드를 직접 가져와서 사용함
해당 쓰레드는 동시성 프로그래밍을 작성하기에 무겁다, 그래서 중량 쓰레드라고 한다
그러면 뭐가 무겁다는 것인가?