한정된 버퍼가 존재하는 상황에서 아래와 같은 상황이 발생할 수 있다.
2번 방식으로 처리하기 위해서는 생산자 및 소비자 Thread가 락을 획득하고 무한대기 하지 않도록 아래와 같은 작업이 필요하다.
이때, Object 클래스의 wait()
, notify()
, notifyAll()
사용이 가능하다.
wait()
public final void wait() throws InterruptedException
wait(0L, 0)
이 호출된 것처럼 동작WAITING
으로 변경notify()
public final void notify()
wait()
메서드를 통해 해당 객체의 모니터에서 대기중인 Thread 중 하나를 깨움IllegalMonitorStateException
발생notifyAll()
public final void notifyAll()
wait()
메서드를 통해 해당 객체의 모니터에서 대기중인 전체 Thread를 깨움notify()
와 유사notify()
의 한계WAITING
상태일 때 소비자 Thread들만 깨어날 수 있음위 내용을 작성하던 중 자바스크립트의 동작에 관해 궁금해졌다.
Javascript는 Single Thread로 동작하는 언어라 한 번에 하나의 작업만을 수행할 수 있다.
동시성을 보장하는 비동기, 논블로킹 작업들은 Javascript 엔진을 구동하는 런타임 환경에서 이루어진다.
이때, 런타임 환경이란 브라우저 혹은 Node.js 등을 의미한다.
하지만 정확히는 비동기 프로그래밍 패턴과 이벤트 루프를 통해 동시성을 지원하는 것처럼 보이게 할 수 있게 하는 것인데, 주요 방식은 아래와 같다.
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
fetchData();
Promise
: 비동기 작업의 완료 또는 실패를 나타내는 객체async
: function
앞에 사용하여 비동기 함수 정의await
: [rv] = await expression;
형태로 사용되며, 프로미스를 기다리기 위해 사용async function
내부에서만 사용 가능