본문 바로가기

TIL(Today I Learned)

TIL-231102(동기와 비동기)

📝오늘 공부한 것

  • 동기와 비동기 공부
  • 커리어톤 참여하기
  • 프로그래머스 문제풀기
  • 이력서 수정하기 & 강의 듣기

📌 동기와 비동기

📍 동기(Synchronous : 동시에 일어나는)

  • 요청과 그 결과가 동시에 일어난다. 바로 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어여야 한다.
  • 동기식 처리 모델 (Synchronous processing model)은 직렬적으로 task를 수행한다.
  • 즉, task는 순차적으로 실행되며 어떤 작업이 수행중이면 다음 작업은 대기하게 된다.
  • 작업 요청을 했을 때 요청의 return값을 직접 받는 것이다.
  • 호출한 함수가 작업 완료를 신경쓴다.

장점 :

  • 순서에 맞춰 진행된다.
  • 설계가 매우 간단하고 직관적이다. 따라서, 작업을 설계하거나 작업의 흐름에 대해서 파악하기 쉽다.
  • 다른 쓰레드에서 접근할 수 없기 때문에 안정적인 작업이 가능하다.(Thread Safe)

단점 :

  • 여러가지 요청을 동시에 처리할 수 없다.
  • 결과가 주어질 때까지 아무것도 못하고 대기해야 한다.

 

https://poiemaweb.com/es6-promise

 

✔ 동기식으로 동작하는 코드

public class Synchronous {
    public static void main(String[] args) {
        method1();
        method2();
        method3();
    }

    public static void method1() {
        System.out.println("method1");
    }
    public static void method2() {
        System.out.println("method2");
    }
    public static void method3() {
        System.out.println("method3");
    }
}

 

  결과

위 결과의 순서는 변하지 않는다.

자바의 특성으로 위에서 아래로 내려오면서 코드가 main문에서 작성한 순서대로 메서드를 실행하게 된다.

 

📍 비동기 (Asynchronous : 동시에 일어나지 않는)

  • 요청과 결과가 동시에 일어나지 않는다.
  • 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다.
  • 비동기식 처리 모델(Asynchronous processing model 또는 Non-Blocking processing model)은 병렬적으로 task를 수행한다.
  • 즉, task가 종료되지 않은 상태라 하더라도 대기하지 않고 다음 task를 실행한다.

장점 :

  • 요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행할 수 있다. 그러므로 자원을 효율적으로 사용할 수 있다.
  • 동기 방식보다 속도가 떨어질 수 있다.

단점 :

  • 동기식보다 설계가 복잡하고 논중적이다.

https://poiemaweb.com/es6-promise

 

  비동기식으로 동작하는 코드

public class Asynchronous {
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            method1();
        });
        Thread t2 = new Thread(()->{
            method2();
        });
        Thread t3 = new Thread(()->{
            method3();
        });

        t.start();
        t2.start();
        t3.start();
    }

    public static void method1() {
        System.out.println("method1");
    }
    public static void method2() {
        System.out.println("method2");
    }
    public static void method3() {
        System.out.println("method3");
    }
}

 

  결과

 

실행할 때마다 순서가 바뀐다. 자바의 쓰레드 스케쥴러에 의해 제어된다.

 

자바에서는 대표적으로 멀티쓰레드의 동작이 비동기식으로 작동한다.

 

자바스크립트에서는 Promise, Callback, async/await 등의 다양한 방법으로 비동기 처리를 구현하는데,

자바에서도 Thread, Callback, Future 등 비동기 처리를 할 수 있는 다양한 방법들이 있다.

 

📍 Blocking / Non-Blocking & 동기 / 비동기

Blocking / Non-Blocking

요청받는 함수가 제어권(함수 실행권)을 언제 넘겨주냐의 차이

  • Blocking : 요청받는 함수가 작업을 모두 마치고 나서야 요청자에게 제어권을 넘겨준다.
    -> 그동안 요청자는 아무것도 하지 않고 기다린다.
  • Non-Blocking : 요청받은 함수가 요청자에게 제어권을 바로 넘겨준다.
    -> 그동안 요청자는 다른 일을 할 수 있다.

 

동기 / 비동기

요청받는 함수가 작업을 완료했는지를 누가 체크하느냐의 차이

  • 동기 : 요청자가 요청받은 함수의 작업이 완료되었는지 계속 확인한다.
    -> 여러 함수들이 시간을 맞춰서 실행된다.
  • 비동기 : 요청자는 요청 후 신경쓰지 않고, 요청받은 함수가 작업을 마치면 알려준다.
    -> 함수들의 작업 시작/종료 시간이 맞지 않을 수 있다.

 

  • Blocking + 동기 :
    요청 받은 함수의 작업이 끝나야 제어권을 돌려 받는다. + 요청자는 결과가 나올때까지 계속 확인한다.
  • Blocking + 비동기 :
    요청 받은 함수의 작업이 끝나야 제어권을 돌려 받는다. + 결과는 요청받은 함수가 알려준다.
  • Non-Blocking + 동기 :
    제어권은 바로 돌려준다. + 요청자는 결과가 나올때까지 계속 확인한다.
  • Non-Blocking + 비동기 :
    제어권은 바로 돌려준다. + 결과는 요청받은 함수가 알아서 알려준다.

 

 

 

 

 

 

 

 

 

 

References :

https://dev-coco.tistory.com/46

https://velog.io/@pllap/Java%EC%97%90%EC%84%9C%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

https://webheck.tistory.com/entry/Java%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B0%A9%EC%8B%9DAsynchronous-processing-model

https://joooing.tistory.com/entry/%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9

'TIL(Today I Learned)' 카테고리의 다른 글

TIL-231104(성능테스트 진행 목적)  (0) 2023.11.04
TIL-231103(성능테스트란 무엇인가)  (0) 2023.11.03
TIL-231101(HTTP Status Code)  (0) 2023.11.01
TIL-231031(Garbage Collection)  (0) 2023.10.31
TIL-231030(HTTP Method)  (0) 2023.10.30