📝오늘 공부한 것
- 동기와 비동기 공부
- 커리어톤 참여하기
- 프로그래머스 문제풀기
- 이력서 수정하기 & 강의 듣기
📌 동기와 비동기
📍 동기(Synchronous : 동시에 일어나는)
- 요청과 그 결과가 동시에 일어난다. 바로 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어여야 한다.
- 동기식 처리 모델 (Synchronous processing model)은 직렬적으로 task를 수행한다.
- 즉, task는 순차적으로 실행되며 어떤 작업이 수행중이면 다음 작업은 대기하게 된다.
- 작업 요청을 했을 때 요청의 return값을 직접 받는 것이다.
- 호출한 함수가 작업 완료를 신경쓴다.
장점 :
- 순서에 맞춰 진행된다.
- 설계가 매우 간단하고 직관적이다. 따라서, 작업을 설계하거나 작업의 흐름에 대해서 파악하기 쉽다.
- 다른 쓰레드에서 접근할 수 없기 때문에 안정적인 작업이 가능하다.(Thread Safe)
단점 :
- 여러가지 요청을 동시에 처리할 수 없다.
- 결과가 주어질 때까지 아무것도 못하고 대기해야 한다.
✔ 동기식으로 동작하는 코드
public class Synchronous {
public static void main(String[] args) {
method1();
method2();
method3();
}
public static void method1() {
System.out.println("method1");
}
public static void method2() {
System.out.println("method2");
}
public static void method3() {
System.out.println("method3");
}
}
✔ 결과
위 결과의 순서는 변하지 않는다.
자바의 특성으로 위에서 아래로 내려오면서 코드가 main문에서 작성한 순서대로 메서드를 실행하게 된다.
📍 비동기 (Asynchronous : 동시에 일어나지 않는)
- 요청과 결과가 동시에 일어나지 않는다.
- 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다.
- 비동기식 처리 모델(Asynchronous processing model 또는 Non-Blocking processing model)은 병렬적으로 task를 수행한다.
- 즉, task가 종료되지 않은 상태라 하더라도 대기하지 않고 다음 task를 실행한다.
장점 :
- 요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행할 수 있다. 그러므로 자원을 효율적으로 사용할 수 있다.
- 동기 방식보다 속도가 떨어질 수 있다.
단점 :
- 동기식보다 설계가 복잡하고 논중적이다.
✔ 비동기식으로 동작하는 코드
public class Asynchronous {
public static void main(String[] args) {
Thread t = new Thread(()->{
method1();
});
Thread t2 = new Thread(()->{
method2();
});
Thread t3 = new Thread(()->{
method3();
});
t.start();
t2.start();
t3.start();
}
public static void method1() {
System.out.println("method1");
}
public static void method2() {
System.out.println("method2");
}
public static void method3() {
System.out.println("method3");
}
}
✔ 결과
실행할 때마다 순서가 바뀐다. 자바의 쓰레드 스케쥴러에 의해 제어된다.
자바에서는 대표적으로 멀티쓰레드의 동작이 비동기식으로 작동한다.
자바스크립트에서는 Promise, Callback, async/await 등의 다양한 방법으로 비동기 처리를 구현하는데,
자바에서도 Thread, Callback, Future 등 비동기 처리를 할 수 있는 다양한 방법들이 있다.
📍 Blocking / Non-Blocking & 동기 / 비동기
Blocking / Non-Blocking
요청받는 함수가 제어권(함수 실행권)을 언제 넘겨주냐의 차이
- Blocking : 요청받는 함수가 작업을 모두 마치고 나서야 요청자에게 제어권을 넘겨준다.
-> 그동안 요청자는 아무것도 하지 않고 기다린다. - Non-Blocking : 요청받은 함수가 요청자에게 제어권을 바로 넘겨준다.
-> 그동안 요청자는 다른 일을 할 수 있다.
동기 / 비동기
요청받는 함수가 작업을 완료했는지를 누가 체크하느냐의 차이
- 동기 : 요청자가 요청받은 함수의 작업이 완료되었는지 계속 확인한다.
-> 여러 함수들이 시간을 맞춰서 실행된다. - 비동기 : 요청자는 요청 후 신경쓰지 않고, 요청받은 함수가 작업을 마치면 알려준다.
-> 함수들의 작업 시작/종료 시간이 맞지 않을 수 있다.
- Blocking + 동기 :
요청 받은 함수의 작업이 끝나야 제어권을 돌려 받는다. + 요청자는 결과가 나올때까지 계속 확인한다. - Blocking + 비동기 :
요청 받은 함수의 작업이 끝나야 제어권을 돌려 받는다. + 결과는 요청받은 함수가 알려준다. - Non-Blocking + 동기 :
제어권은 바로 돌려준다. + 요청자는 결과가 나올때까지 계속 확인한다. - Non-Blocking + 비동기 :
제어권은 바로 돌려준다. + 결과는 요청받은 함수가 알아서 알려준다.
References :
'TIL(Today I Learned)' 카테고리의 다른 글
TIL-231104(성능테스트 진행 목적) (0) | 2023.11.04 |
---|---|
TIL-231103(성능테스트란 무엇인가) (0) | 2023.11.03 |
TIL-231101(HTTP Status Code) (0) | 2023.11.01 |
TIL-231031(Garbage Collection) (0) | 2023.10.31 |
TIL-231030(HTTP Method) (0) | 2023.10.30 |