Javascript는 싱글 스레드 언어이다. 그렇기 때문에 프로그램에 대한 내부적인 처리가 하나의 맥에서 이루어지며, 동일 시간에 하나의 함수만을 처리한다.
이에 반해 Java는 멀티 스레드 언어로서, 동일 시간에 여러가지 명령을 수행할 수 있으며, 대표적인 기술이 Aggressive Inlining이다.
JS → 싱글 스레드 언어 → method-at-a-time
Java → 멀티 스레드 언어 → methods-at-a-time
JS 자체는 싱글 스레드 언어지만, JS가 실행되는 일반적 환경인 웹 브라우저에서 비동기 처리가 가능할 수 있도록 지원해주기 때문이다.
Javascript Runtime에는 단일 Call Stack과 Heap이 존재하며, 명령을 순차적으로 수행한다.
비동기처리를 지원해주는 요소에는 Web APIS, Callback Queue, Event Loop가 있다. 해당 요소들은 Web Browser에서 지원해주기 때문에, Web Browser에 따라 구조나 구현방식이 상이할 수 있다.
Event Loop는 Callback Queue에 담긴 메세지와 Call Stack을 모니터링하고 있다가 Call Stack이 비면 우선순위가 높은 메세지를 뽑아 Call Stack으로 올리는 역할을 한다.
JS는 싱글 스레드 언어이기 때문에 성능상의 단점이 있지 않을까하는 의문이 들었다. Web Worker API를 이용하면 실제로 여러 개의 Event Loop를 사용할 수 있지만, 해당 솔루션은 많이 이용되지 않는다. 비동기 처리의 고도화, 게이트 웨이 등의 분산 처리로 해결하는 것이 일반적이라고 한다. 성능이 중요한 어플리케이션의 경우 WASM을 이용할 수 있다.
https://velog.io/@jakeseo_me/2019-03-15-2303-작성됨-rmjta5a3xh
https://www.educative.io/edpresso/what-is-an-event-loop-in-javascript
https://www.wheelhouse.be/insights/multi-threading-in-js-and-what-you-can-do-with-it
https://meetup.toast.com/posts/89