동기(Synchronous)
- Syn(together) + chrono(time) : 동시에 일어나는
A --------------------> A
B --------------------> B
즉, A와 B가 시작 시각 또는 종료 시각이 일치하면 동기입니다.
- A, B 스레드가 동시에 작업을 시작하는 경우(CyclicBarrier)
- A, B가 동시에 작업이 끝나는 경우
- 메소드 리턴시간와 결과를 전달받는 시간이 일치하는 경우
- Task1이 끝나는 시간과 Task2가 시작하는 시간이 같은 경우
- 작업 요청을 했을 때 요청의 결괏값(return)을 직접 받는 것
- 이때, 요청의 결괏값이 return 값과 동일하다.
- synchronized, BlockingQueue
비동기(Asynchronous)
- A + syn(together) + chrono(time) : 동시에 일어나지 않는
A --------------------> A
B -----------> B
A --------------------> A
B -----------> B
A와 B가 서로의 시작, 종료 시각과는 관계없이 별도의 수행 시작/종료 시각을 가지고 있는 경우를 의미합니다.
- Thread1이 Task1을 수행하고, Task1이 완료되길 기다리지 않고 Task2를 처리할 수 있습니다.
- 작업 요청 시 요청의 결괏값을 간접적으로 받는 것이며, 요청의 결괏값이 return 값과 다를 수 있습니다.
- Task1, Task2는 별도의 스레드에서 실행하게 됩니다.
Blocking / Non-Blocking
직접 제어할 수 없는 대상을 상대하는 방법으로 즉, 다른 작업을 수행하는 주체를 어떻게 상대하는지가 중요합니다.
- 대상이 IO/멀티스레드 동기화 등 제한적
Blocking
Blocking은 자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작하는 것입니다.
- 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에 제어권을 넘겨주지 않고 대기하게 만든다면 blocking
Non-Blocking
논 블로킹은 다른 주체의 작업과 관계없이 자신의 작업을 계속하는 것입니다.
- 호출된 함수가 바로 return 해서 호출한 함수에 제어권을 넘겨주고 호출한 함수가 다른 일을 할 기회를 줄 수 있으면 non-blocking
동기/비동기와 블로킹/논 블로킹의 조합
Synchronous + Blocking
- 동기(Synchronous) : 두 개 이상의 작업의 시작 시각, 종료 시각이 같거나 시작과 동시에 종료
- 블로킹(Blocking) : 다른 작업을 하는 동안 자신의 작업을 일시 정지
위 두가지를 만족하는 예는 다음과 같습니다.
- JDBC를 이용해 DB에 쿼리 질의를 날림
- 메서드에서 다른 메서드를 호출하여 결과값을 즉시 받아옴
Asynchronous + Blocking
- 비동기(Asynchronous) : 다른 작업과 시작, 종료 시각이 같지 않음
- 블로킹(Blocking) : 다른 작업의 주체가 작업하는 동안 기다림
비동기 + 블로킹 조합은 결국 다른 작업이 끝날 때까지 기다려야하므로 동기 + 블로킹과 비슷한 작업 효율이 나옵니다.
Synchronous + Non-Blocking
- 동기(Synchronous) : 두 개 이상의 작업의 시작 시각, 종료 시각이 같거나 시작과 동시에 종료
- 논블로킹(Non-Blocking) : 다른 작업의 주체가 작업하는 동안 기다리지 않음
논 블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해서 계속해서 작업이 끝났는지 조회합니다.
Asynchronous + Non-Blocking
- 비동기(Asynchronous) : 다른 작업과 시작, 종료 시각이 같지 않음
- 논 블로킹(Non-Blocking) : 다른 작업의 주체가 작업하는 동안 기다리지 않음
자신의 작업이 멈추지도 않고, 다른 주체가 하는 작업의 결과가 나왔을 때 콜백을 설정하기도 합니다.
다른 주체에게 작업을 맡겨두고 자신이 하던 일을 계속할 수 있으므로, 해야 할 작업이 대규모이고 동기가 필요하지 않을 때 효과적입니다.
만족하는 예시는 다음과 같습니다.
- 대규모 사용자에게 푸시 메세지 전송
- 다양한 외부 API한번에 호출
'개발' 카테고리의 다른 글
DDD - 도메인이란? (1) | 2024.09.19 |
---|---|
TDD (테스트 주도 개발) (1) | 2024.09.18 |
JPA 연관관계 (2) | 2024.09.18 |
JPA 영속성 관리 (3) | 2024.09.11 |
GIT (2) (0) | 2024.09.10 |