가끔 책을 보다보면 동기, 비동기에 대해서 이상하게 길고 복잡하게 설명한 경우를 볼 수 있다.
하지만 사실 이건 굉장히 간단한 용어이다.
(물론 이 간단한 개념을 각 언어로 구현하는게 쉽다는 건 아니다....ㅎ... 개념과 실전은 또 별개니까,,,ㅎ)
동기 (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가 진행될 것이다.
'Language > 기본 용어' 카테고리의 다른 글
모바일 AP 란? (0) | 2022.01.14 |
---|---|
모뎀 (modem), 공유기 (router) 란?? (0) | 2022.01.14 |
mobile AP CPU 의 ARM (feat. RISC, CISC) (0) | 2022.01.14 |
x86 x64 차이점 (CPU, OS, software) (0) | 2022.01.14 |
필드(Field), 변수(Variable), 맴버변수, 전역변수, 지역변수, 인스턴스 변수, 스태틱 변수 등 관계 깔끔하게 정리 (0) | 2022.01.12 |