WEB, WAS, APM/기타

[Java] 동기? 비동기?

esne 2025. 6. 4. 15:53
자바에서는 기본적으로 동기 처리 방식을 사용한다.
# 자바 언어 명세: 메서드 호출의 실행 순서
15.12.4. Run-Time Evaluation of Method Invocation
At run time, method invocation requires six steps. First, a target reference may be computed. Second, the argument expressions are evaluated. Third, the accessibility of the method to be invoked is checked. Fourth, the actual code for the method to be executed is located. Fifth, a new activation frame is created, synchronization is performed if necessary, and sixth, control is transferred to the method code.
→ 메서드 호출이 현재 실행 중인 스레드에서 순차적으로 처리되며, 호출된 메서드의 실행이 완료될 때까지 호출한 메서드는 대기한다는 것을 의미한다. 이는 자바에서 메서드 호출이 기본적으로 동기적으로 처리된다는 것을 나타낸다.
# 자바 튜토리얼: 동기화(Synchronization)
Synchronization
Threads communicate primarily by sharing access to fields and the objects reference fields refer to. This form of communication is extremely efficient, but makes two kinds of errors possible: thread interference and memory consistency errors. The tool needed to prevent these errors is synchronization.
→ 자바에서 여러 스레드가 공유 자원에 접근할 때 발생할 수 있는 문제를 방지하기 위해 동기화가 필요하다는 것을 설명하고 있다. 이는 자바에서 기본적으로 단일 스레드에서 코드가 순차적으로 실행되며, 명시적으로 동시성을 구현하지 않는 한 메서드 호출은 동기적으로 처리된다는 것을 설명한다.

 

Total time taken by the task: 좌측(Synchronous) 37(15+5+10+7)seconds, 우측 15 seconds

 
"스레드의 제어권"과 관련된 개념: Blocking/Non-Blocking
"작업 완료 여부에 따라 다음 로직을 언제 시작하느냐"와 관련된 개념: Synchronous, Asynchronous

  • Blocking
    호출된 함수가 작업을 모두 완료할 때까지 호출자 스레드가 대기(block) 한다. 제어권을 반환하지 않음.
  • Non-Blocking
    호출된 함수가 바로 제어권을 반환하고, 호출자 스레드는 대기하지 않음.
  • Synchronous(동기)
    호출자는 결과가 나올 때까지 작업 완료를 기다림. 다음 작업은 결과가 나와야 가능.
  • Asynchronous(비동기)
    호출자는 호출 직후 즉시 다음 로직 실행 가능. 결과는 나중에 콜백/퓨처 등을 통해 전달.

 

자바에서 비동기 처리를 위한 주요 인터페이스들
  • Java 5 도입: Future 인터페이스 - 어떤 비동기 작업의 결과를 담는 그릇. 작업을 요청하고 나중에 그 결과를 가져올 수 있게 해준다.
  • Java 7 도입: ForkJoinPool - Java Concurrency 툴, 동일한 작업을 여러개의 Sub Task로 분리(Fork)하여 각각 처리하고, 이를 최종적으로 합쳐서(Join) 결과를 만듦
  • Java 8 도입: CompletableFuture - 기존의 Future 인터페이스가 제공하지 못했던 비동기 결과 값의 조합과 예외 처리를 훨씬 더 효과적으로 수행할 수 있는 기능을 갖춘 인터페이스, 내부적으로 ForkJoinPool.commonPool()을 사용하여 작업을 병렬화

'WEB, WAS, APM > 기타' 카테고리의 다른 글

[Java] 소켓  (0) 2025.06.20
[Java] 입출력/스트림  (0) 2025.06.19
[Java] Thread(쓰레드)  (1) 2025.06.19