TIL | [CS] 동기와 비동기

hyemin·2022년 3월 29일
0

CS

목록 보기
2/5
post-thumbnail

동기와 비동기는 무엇이 다른가요?


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

동기는 요청과 결과가 동시에 일어난다는 뜻으로 메소드를 실행시킴과 동시에 반환값이 기대되는 경우를 뜻한다. 동기식 처리를 하면 작업이 순차적으로 처리되어 이전 작업이 끝나지 않으면 다음 작업이 bloking 되어진다.

Bloking
작업을 진행하다가 다른 작업이 시작되면 끝날 때까지 기다렸다가 작업을 시작하는 것

Task1을 처리하다가 서버에 데이터 요청을 하게되면 데이터를 받아올 때까지 Task1 작업은 멈추어졌다가 데이터를 다 받아오면 다시 처리를 시작하게된다.

동기식 코드 예시

public class Synchro {
	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");
	}
	
}

출력

method1
method2
mehtod3

프로그램을 반복해서 실행해도 자바의 main thread에 의해 작성한 순서대로 메서드를 실행하게 된다.

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

비동기는 요청과 결과가 동시에 일어나지 않는다는 의미로 메소드 실행 후 반환값이 바로 기대되지 않는 경우를 뜻한다. 비동기식 처리를 하면 병렬적으로 처리가 이뤄져 여러개의 작업이 동시에 처리될 수 있다.


Task1을 처리하다가 서버에 데이터 요청을 보낸 이후 데이터 응답을 대기하지 않고 즉시 다른 Task(Task2)를 수행하게 된다. 데이터가 응답되면 이벤트 핸들러가 받은 데이터로 Task1을 이어서 수행해 나간다.

비동기식 코드 예시

public class Asynchro {
	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");
	}
}

출력

<1>
method1
method2
method3

<2>
method2
method1
method3

<3>
method3
method2
method1

입력한 순서대로 method1, 2, 3이 순서대로 출력될 것이라 예상했을 수 있지만, 자바의 Thread 스케쥴러에 의해 제어되어 실행을 할 때마다 출력 순서가 바뀌게 된다.

동기/비동기


동기식 처리는 주문과 픽업이 한 곳에 서 이뤄져 한 줄로 서서 차례대로 처리받는 것과 같다. 그리하여 설계가 간단하고 직관적이라는 장점이 있지만, 결과가 주어질 때까지 대기해야하므로 비효율적이라는 단점이 있다.

비동기식 처리는 주문하는 곳과 음료를 픽업하는 곳이 달라 주문을 하고 다른 일을 잠깐 하고 음료를 전달 받는 것과 같다. 그렇기에 결과가 주어지는데 시간이 걸리더라도 다른 작업을 할 수 있어 효율적이지만, 동기식처리보다 복잡하다는 단점이 있다.

요약

Q. 동기(Sync)와 비동기(Async)의 차이는 무엇인가요?

A. 연관된 작업을 처리하는 방식의 차이가 있습니다. 동기는 메소드를 실행시킴과 동시에 반환값을 기대하여 값이 반환되기 전까지 다른 작업이 중단(bloking)되지만, 비동기는 한 작업의 완료 시점과 상관없이 다른 작업을 시작하기 때문에 자원을 효율적으로 사용할 수 있는 방식입니다.

0개의 댓글