본문 바로가기
Language/기본 용어

비동기 처리 vs 동기 처리

by jungwon3004 2021. 11. 10.
728x90
반응형

가끔 책을 보다보면 동기, 비동기에 대해서 이상하게 길고 복잡하게 설명한 경우를 볼 수 있다.

하지만 사실 이건 굉장히 간단한 용어이다.

(물론 이 간단한 개념을 각 언어로 구현하는게 쉽다는 건 아니다....ㅎ... 개념과 실전은 또 별개니까,,,ㅎ)

동기 (Synchronous) vs 비동기 (Asynchronous)

- 동기: synchronous라는 말 그대로 "동시에 일어난다"는 뜻

- 비동기: synchronous가 아님, 즉, "동시에 일어나지 않는다"는 뜻

 

여기서 중요한 건 무엇이 동시에 일어나고 무엇이 동시에 일어나지 않느냐는 것이다.

바로 "요청"과 "결과"가 동시에 일어나는지가 핵심이다!!

 


 

 쉬운 예를 들어서, 카페에서 주문을 받는다고 생각해보자.

 

 먼저, 알바 한 명이서 주문 하나 받고 음료 하나 만들어서 손님에게 주고 새로운 주문 받고 음료 만들어서 주고를 반복한다면 어떨까? 

시간은 오래 걸릴 수 있어도 틀리진 않을 것이다.

물론 뒤에 기다리는 손님은 많이 기다려야 겠지만!

 우리는 이걸 "동기 (synchronous)"라고 한다.

 

 그럼 다른 경우를 보자. 만약 알바가 한 번에 주문을 쭉 받고 동시에 여러 음료수를 만들면 어떨까?

동시에 여러 음료를 만들게 되기 때문에 시간은 줄어들 수 있지만 자칫 여러 음료를 만드는 과정이 겹치거나 꼬일 수도 있다.

이 방식을 "비동기 (asynchronous)"라고 한다.

 


 

이건 굉장히 간단한 예시로 설명한 것이고 이를 구현하는 하나의 예제를 보도록 하자.

Java의 multi thread 간단 예시이다.

public class Main{
	public static void main(String[] args){
    	Task task = new task();
        
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        
        t1.start();
        t2.start();
	}
}

class Task implements Runnable{
	public void run(){
    	for(int i=0;i<5;i++){System.out.println("a");}
    }
}

굉장히 간단한 예시인데, t1과 t2가 동시에 번갈아가면서 실행된다.

이 상태를 asynchronous, 즉 비동기화 상태라고 한다.

 

public class Main{
	public static void main(String[] args){
    	Task task = new task();
        
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        
        t1.start();
        t2.start();
	}
}

class Test{
	public synchronoized void print(){
    	for(int i=0;i<5;i++){System.out.println("a");}
    }
}

class Task implements Runnable{
	public void run(){
    	Test t = new Test();
        t.print();
    }
}

이것도 굉장히 간단한 예시이다.

Test 클래스의 pirnt() method에는 synchronized가 추가되어 있다.

즉, print() method는 동시에 진행될 수 없다는 것이다.

main()의 진행의 흐름을 보면, t1이 다 끝나야 t2가 진행될 것이다.

728x90
반응형