일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 필드 주입
- static
- SQL
- stream
- StringBuilder
- 생성자 주입
- jwt
- cache
- redis
- MSA
- 열 속성
- java
- 재정의
- jpa
- lambda
- KEVISS
- Test
- DDL
- equals
- select_type
- VUE
- Spring
- 바이너리 카운팅
- hashcode
- 테스트 코드
- 조합
- AOP
- docker
- DI
- 인덱스
- Today
- Total
백엔드 개발자 블로그
블럭킹 | 논블럭킹 | 동기 | 비동기 본문
Blocking | Non Blocking | Sync | Async 에 대해 알아봅시다.
BLOCKING vs NON BLOCKING
제어권을 넘기는지 / 안넘기는지로 구분합니다.
Blocking
- 다른 주체의 작업이 시작되면 제어권이 넘어가기에 다른 작업이 끝날 때까지 기다립니다.
Non Blocking
- 제어권이 자신에게 있으므로 다른 추젝의 작업과 관련없이 자신의 작업을 합니다.
SYNC vs ASYNC
순서와 결과에 관심이 있는지 없는지로 판단합니다.
Sync
- 앞 작업 결과 반환이 있어야 다음 작업 시작이 가능합니다.
ASync
- 앞 작업 결과 반환이 없어도 다음 작업 시작이 가능합니다.
조합해봅시다
블럭킹 & 동기
호출한 함수(A)는 호출되는 함수(B)의 작업 결과에 관심이 있고, 제어권이 없기 때문에 호출되는 함수(B)의 결과를 기다리는 형태입니다.
어느 경우에 볼 수 있을까?
일반적인 Spring MVC 방식에서는 대부분 블럭킹, 동기 방식으로 동작합니다.
블럭킹 & 비동기
호출한 함수(A)는 호출되는 함수(B)의 작업 결과에 관심이 없음에도 불구하고, 제어권이 없어서 호출되는 함수(B)의 결과를 기다리고 있어야 하는 형태입니다.
어느 경우에 볼 수 있을까?
이 조합의 큰 이점이 없기에 확인하기 힘든 케이스이지만, Node.js와 Mysql조합에서 확인할 수 있습니다.
Node.js는 논블럭킹 비동기 방식으로 동작하고 Mysql은 블럭킹 방식으로 동작하기 때문에 Node.js 언어로 Mysql의 데이터를 사용한 로직을 구현하다 보면 중간 중간 블럭킹 비동기 방식으로 동작하는 경우를 확인할 수 있습니다.
논블럭킹 & 동기
처음엔 함수 호출만 합니다. 호출된 함수의 결과를 반환 받아야 다음 업무를 할 수 있기에 지속적으로 완료 확인을 합니다. 완료 확인이 되면 다음 업무를 시작합니다.
어느 경우에 볼 수 있을까?
자바에서 Future를 사용하면 확인할 수 있습니다. Future 인스턴스는 호출 여부에 대한 결과만 보유하고 있고 결과값에 대한 여부는 확인하지 않습니다. 그러므로 Future를 사용하여 필요한 외부 로직을 요청하고 내부에선 다른 로직을 수행하다가 어느 정도 작업이 마무리되면 외부에 호출된 결과값을 확인하여 기다리다 나머지 로직을 수행할 수 있습니다.
@GetMapping("sync-nonblock")
public void syncNonBlock(){
ExecutorService service = Executors.newSingleThreadExecutor();
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info("BlockController.syncNonBlock.call");
return "Future Done!!";
}
};
Future<String> future = service.submit(task);
try {
logger.info("BlockController.syncNonBlock.main");
String futureResult = future.get();
System.out.println("futureResult: " + futureResult);
} catch (Exception e) {
// Exception Handling
}
}
논블럭킹 & 비동기
함수 호출만 하고 자신의 업무를 하는 형태입니다.
어느 경우에 볼 수 있을까?
Node.js가 논블럭킹 비동기 방식으로 동작합니다. 또는 @Async를 사용해도 유사한 케이스를 확인할 수 있습니다.
public void asyncBlock(){
blockService.async();
logger.info("BlockController.asyncBlock");
}
@Async
public void async(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info("BlockService.async");
secondBlockService.async();
}
결론
동기는 호출자의 입장에서 바라보는 개념이고, 블럭킹은 제어권(또는 쓰레드) 관점입니다.
- Blocking : 제어권을 호출한 함수에게 넘깁니다.
- NonBlocking : 제어권을 호출한 함수에게 넘기지 않습니다.
- Sync : 앞에서 호출한 함수 결과가 반환 되어야 다른 함수 호출이 가능합니다.
- ASync : 앞에서 호출한 함수 결과를 반환하지 않아도 다른 함수 호출이 가능합니다.
참고
- https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
- https://medium.com/@ahaljh/동시성-관련-개념-d2f3e6a62b99
- https://www.slideshare.net/unitimes/sync-asyncblockingnonblockingio
- [https://medium.com/@ahaljh/%EB%8F%99%EC%8B%9C%EC%84%B1-%EA%B4%80%EB%A0%A8-%EA%B0%9C%EB%85%90-d2f3e6a62b99](https://medium.com/@ahaljh/동시성-관련-개념-d2f3e6a62b99)
'Java' 카테고리의 다른 글
heap dump 분석하기 (feat. OOM) (0) | 2024.04.29 |
---|---|
병렬처리를 이용한 이미지 리사이즈 개선 (0) | 2024.04.29 |
스택 오버 플로우(SOF) (0) | 2024.04.18 |
JDK 버전 고려해보기 (0) | 2024.04.17 |
String, StringBuffer, StringBuilder (0) | 2024.04.16 |