개요
동기와 비동기, 블로킹과 논블로킹, 많이 들어본 용어이지만 가끔씩은 헷갈린다.
어떤 기준으로 나뉘었는지 알아보고 이 두 종류 조합도 알아보자.
동기와 비동기
동기와 비동기를 나누는 기준은 '작업들을 순차적으로 수행하는지'에 대한 관점이다.
동기는 작업을 순차적으로 수행하고, 비동기는 작업들이 순서에 상관없이 수행된다.
블로킹과 논블로킹
블로킹과 논블로킹을 나누는 기준은 '작업의 제어권을 어떻게 처리하느냐'에 대한 관점이다.
다른 말로 '현재 진행중인 작업이 block 되느냐 안되느냐'이다.
A 작업이 B 작업을 호출할 때 제어권을 A가 B에게 넘기게 되어서 A 작업이 중단된다면, 해당 상황은 블로킹이다.
반대로 A 작업이 B 작업을 호출해도 제어권을 A 작업이 그대로 갖고 있어 작업이 중단되지 않는다면, 해당 상황은 논블로킹이다.
동기 + 블로킹 조합

작업이 순차적으로 진행이 되면서(동기), 다른 작업이 진행되는 동안 자신의 작업은 중단되는 조합이다.(블로킹)
다른 작업의 결과가 자신의 작업에 영향을 주는 경우 활용되는 조합이며, 아주 일반적이다.
public void printResult() {
int a = 10;
int b = 20;
int result = calculate(a, b);
System.out.println(result);
}
public int calculate(int a, int b) {
Thread.sleep(1000);
return a + b;
}
printResult() 메서드 호출 후에 calculate() 메서드가 순차적으로 호출되며(동기), calculate() 메서드가 작업을 마칠 때까지 printResult() 메서드는 자신의 작업을 처리하지 못한다.(블로킹)
비동기 + 논블로킹 조합

작업이 순차적으로 이루어져야 할 필요가 없고(비동기), 다른 작업이 진행되는 동안 자신의 작업도 함께 진행되는 조합이다.(논블로킹)
다른 작업의 결과가 자신의 작업에 영향을 주지 않는 경우이다.
CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
return "데이터";
}).thenAccept(result -> {
System.out.println("2. 결과: " + result); // 1초 후 실행
});
System.out.println("1. 메인 계속"); // 바로 실행
멀티 스레드를 통해 다른 작업을 할당하여 처리하고, 결과를 기다리지 않는다. (비동기)
현재 진행중인 작업이 중단되지 않고, 별도의 스레드가 할당되어 다른 작업을 진행한다.(논블로킹)
다음 코드의 결과는 아래와 같다.
1. 메인 계속
2. 결과: 데이터
동기 + 논블로킹 조합

다른 작업이 진행되는 동안에도 자신의 작업을 처리하지만(논블로킹), 작업이 순차적으로 진행된다.(동기)
작업을 순차적으로 진행하기 위해서, 원래 작업에서 다른 작업의 결과를 계속해서 확인해야 한다.
Future<String> future = executor.submit(() -> fetchData());
// 완료됐는지 계속 확인
while (!future.isDone()) {
System.out.println("아직 안됨, 다른 일 하는 중...");
Thread.sleep(100);
}
String result = future.get();
멀티 스레드를 통해 다른 작업을 할당하여 제어권은 넘어가지 않았다.(논블로킹)
하지만 다른 작업의 결과를 기다려서 순차적으로 로직을 처리해야 한다. (동기)
비동기 + 블로킹

작업이 비순차적으로 진행되지만 (비동기), 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않는다. (블로킹)
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> fetchData());
String result = future.get(); // 블로킹
System.out.println(result);
멀티 스레드를 통해 다른 작업 할당하여 비순차적으로 진행할 수 있지만, (비동기)
굳이 현재 작업을 블로킹하여 다른 작업의 결과를 기다려서 작업을 처리한다. (블로킹)
결국 블로킹으로 인해 동기적으로 작업을 진행하게 된다. 때문에 해당 조합을 안티 패턴으로 보기도 한다.
'Etc' 카테고리의 다른 글
| JSCODE 운영체제 스터디 회고 (0) | 2025.04.15 |
|---|