Sync 와 Async 에 대한 이해

 

 

동기란 어떠한 일이 동시에 일어남을 뜻한다.

 

우리가 실생활에서 많이 사용하는 'A와 B를 동기화하다' 와 같이,

동기는 A와 B를 동시에 같은 상태로 만든다는 의미를 가지고 있다.

 

즉, 두 상태를 일치시킨다는 뜻이다.

 

아래와 같이 동기식으로 동작하는 예제를 보자.

 

public class test {
    public static void main(String[] args) {
        System.out.println(method1());
        System.out.println(method2());
    }

    public static int method1() {
        return 1;
    }
    public static int method2() {
        return 2;
    }
}

 

method1이 실행되고 완료가 되면

그 후 순차적으로 method2가 실행되는 것을 synchronous 한 동작이라고 말한다.

 

그런데 이 과정에서 어느 부분이 동시에 일어났다는 것일까?

 

 

 

 

 

동기화를 말하는 기준은 메소드의 호출 및 반환 시점이다.

시점을 기준으로 그림을 그려보았다.

 

동기화 된 메소드 호출

 

메소드가 호출됨과 동시에 메소드가 실행되고, 메소드가 완료됨과 동시에 리턴값을 반환한다.

메소드의 호출 및 반환 시점이 동기화되었다는 의미인 것이다.

 

 

 

 

그렇다면 비동기 호출도 쉽게 이해할 수 있다.

 

비동기 메소드 호출

 

비동기 호출이란 메소드의 반환 시점과 완료 시점이 일치하지 않음을 뜻한다.

메소드 수행을 완료하기 이전에 먼저 반환을 한다. 

 

 

이러한 async 방식은 동기식 호출의 단점을 극복하기 위해서 디자인 된 모델이다.

 

동기식으로 메소드를 호출한다면,

완료 시점에 리턴되기 때문에 메소드가 실행되는 동안은 다른 일을 할 수가 없다.

 

비동기식으로 메소드를 호출한다면,

메소드의 수행 완료와 관계 없이 메소드가 리턴을 하기 때문에 다른 일을 진행할 수 있게 되는 것이다.

 

 

 

 

 

Blocking vs. Non-Blocking

 

앞에서 배운대로 메소드가 수행되는 동안 다른 일을 하기 위해

비동기 식으로 메소드를 호출하려고 한다고 가정해보자.

 

메소드는 실행과 동시에 리턴이 된다고 했는데,

그렇다면 우리는 메소드 수행 결과를 어떻게 알 수 있을까?

 

 

 

 

첫 번째로, 결과를 리턴받는 메소드를 호출하는 방법이 있다.

다른 작업을 수행하다가 이전에 호출했던 메소드의 결과값을 리턴받고 싶을 때, 수행 결과를 가져오는 메소드를 호출한다.

 

method1 호출 후 다른 작업을 수행하던 Client(작업 요청자)가 get 메소드를 호출했다고 가정해보자.

로직의 흐름을 기준으로 그림을 그려보았다.

 

Async-Blocking

 

 

우리는 메소드를 수행하는 시간에 다른 일을 처리하기 위해 비동기 식으로 메소드를 호출했지만

method1이 완료될때까지 기다려야하는, 작업이 멈추는 상황에 직면하게 된다.

 

이렇게 작업 요청자의 로직을 멈추게 되는 것을 Blocking 이라고 한다.

 

반대로 작업 요청자의 로직을 멈추지 않고 바로 리턴하는 것을 Non-Blocking 이라고 한다.

 

 

즉, Async 방식이라고 해서 반드시 Non-Blocking 인 것은 아니며 이는 구분되는 다른 개념이라는 것이다.

 

 

 

 

 

두 번째로, 우리가 원하던 대로 메소드가 수행되는 동안 다른 일을 하기 위해 콜백 함수를 사용해보자.

 

 

Async-Non-Blocking

 

이렇게 콜백 메소드를 이용해서 Async-Non-Blocking 을 구현할 수 있다.

 

 

 

여기까지 자바 비동기 병렬 프로그램을 공부하기 이전에
Sync vs. Async / Blocking vs. Non-Blocking 에 대해서 알아보았다.

 

다음 포스팅에서는 Java8에서 어떻게 비동기 병렬 프로그램을 구현하는지 자세히 알아보도록 하겠다!

 

 

 

 

 

 

참고)

https://brunch.co.kr/@springboot/267

https://wbluke.tistory.com/49

복사했습니다!