동기(Synchronous)와 비동기(Asynchronous)는 작업 수행 방식과 그에 따른 응답 처리의 차이를 설명하는 개념으로, 프로그래밍과 시스템 설계에서 매우 중요한 개념입니다.
public void synchronousMethod() {
System.out.println("Step 1: Start");
Thread.sleep(3000); // 3초 동안 대기
System.out.println("Step 2: Complete");
}
출력:
Step 1: Start
(3초 대기)
Step 2: Complete
public void asynchronousMethod() {
System.out.println("Step 1: Start");
new Thread(() -> {
try {
Thread.sleep(3000); // 3초 동안 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Step 2: Complete");
}).start();
System.out.println("Step 3: Continue other work");
}
출력:
Step 1: Start
Step 3: Continue other work
(3초 후)
Step 2: Complete
특성 | 동기(Synchronous) | 비동기(Asynchronous) |
---|---|---|
작업 처리 방식 | 순차적으로 실행 | 병렬적으로 실행 |
대기 시간 | 요청 완료까지 대기 | 대기 없이 즉시 다른 작업 실행 |
효율성 | 낮음 | 높음 |
구현 복잡성 | 단순 | 복잡 |
사용 사례 | 데이터베이스 트랜잭션, 파일 읽기 | UI 이벤트 처리, 네트워크 요청 |
Thread.sleep
time.sleep
CompletableFuture
, ExecutorService
async/await
, Promise
파일 읽기/쓰기:
FileInputStream fileInputStream = new FileInputStream("file.txt");
int data = fileInputStream.read(); // 파일에서 데이터 읽기 동안 대기
파일에서 데이터를 읽는 동안 스레드는 멈추며, 작업이 완료되면 다음 코드로 진행합니다.
HTTP 요청:
URL url = new URL("https://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.getInputStream(); // 응답을 받을 때까지 대기
특성 | 동기(Synchronous) | 블로킹(Block) |
---|---|---|
초점 | 작업 순서: 작업이 순차적으로 진행 | 작업 상태: 스레드가 멈춰 기다림 |
스레드 상태 | 순차적으로 실행 | 대기 상태에서 자원을 점유 |
작업 흐름 | 작업이 완료된 후 다음 작업 시작 | 특정 작업이 끝나야 스레드가 깨어남 |
비교 관계 | 동기 작업이 반드시 블로킹일 필요는 없음 | 블로킹은 동기 작업에서 흔히 발생 |
특성 | 비동기(Asynchronous) | 논블로킹(Non-Blocking) |
---|---|---|
작업 흐름 | 작업 완료를 기다리지 않고 즉시 반환 | 작업 완료를 기다리지 않으며, 결과를 나중에 확인 |
스레드 상태 | 스레드는 다른 작업을 수행하거나 대기 | 스레드는 대기하지 않고 즉시 다음 작업 수행 |
주요 특징 | 콜백, Future, Promise 등을 통해 처리 | 이벤트 루프, 논블로킹 I/O 사용 |
추가 학습 자료