본문 바로가기
CS

동기와 비동기

by Ropung 2023. 10. 13.

동기비동기.png

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

  • 동기는 말 그대로 동시에 일어난다는 뜻이다. 요청과 그 결과가 동시에 일어난다는 약속이다.
  • 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 한다.
  • 요청한 결과가 한자리에서 동시에 일어남
  • A노드와 B노드 사이의 작업 처리 단위(transaction)을 동시에 맞추겠다.

장점: 설계가 매우 간단하고 직관적

단점: 결과가 주어질 때까지 아무것도 못하고 대기해야 한다.


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

  • 비동기는 동시에 일어나지 않는다는 의미이다. 요청한 결과는 동시에 일어나지 않을거라는 약속이다.
  • 요청한 그 자리에서 결과가 주어지지 않는다.
  • 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.

장점: 결과가 주어지는데 시간이 걸리더라도 그 시간 동안에 다른 작업을 할 수 있으므로 자원들을 효율적으로 사용 할 수 있다.

단점: 동기보다 복잡한 설계


동기와 비동기의 예

동기와 비동기의예.png

동기방식

  • 요청이 들어온 순서에 맞게 하나씩 처리하는 방식이다.
  • 설계가 매우 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 못하고 대기해야하는 단점이 있다.

비동기 방식

  • 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다.
  • 여러 개의 요청을 동시에 처리할 수 있는 장점이 있지만 동기 방식보다 속도가 떨어질 수도 있다.

동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있다.


Java에서 동기화를 고민해보자.

자바에서 자료구조를 공부하다보면 계속해서 나타나는 단어가 있다.
그것이 바로 동기화라는 단어인데 굉장히 유사한 기능을 가진 두 가지의 자료 구조간의 차이점이 동기화 지원여부의 차이점인 경우가 종종 있다.

여기에 포함되는 것이 ArrayList, Vector, StringBuffer,StringBuilder, HashMap, HashTable의 경우가 동기화를 지원하는 경우이다.

Thread?

자바에서는 기본적으로 멀티 스레드를 지원하는 언어이다.
자바스크립트는 싱글 스레드를 지원하는 언어이다.

동기화를 이해하기 위해서는 스레드(Thread)라는 개념을 알아야 한다.
스레드는 실행되고 있는 프로그램이라 볼 수 있고 내부에서 실행되는 흐름의 단위를 스레드라고 한다.

자세한 설명은 아래에서 따로 다루기로 하자.

정리하면

Java가 실행되면 우리가 Java를 실행시킬 때 사용하는 main()매서드로부터 main 스레드가 실행되며 이 main 스레드의 흐름이 곧 프로그램의 흐름이 되는 것이다.

그럼 위에 상황처럼 main 스레드만 있는 상황을 싱글 스레드라고 볼 수 있지만 자바의 경우 멀티 스레드를 지원하는 언어이다. 멀티와 싱글의 차이는 몇명의 사람이 일을하는지 생각하면 편하다.

싱글스레드 - 혼자 일하는것
멀티스레드 - 여러명의 사람이 함께 일하는 것

정도로 이해하면 될 것 같다.

ArrayList와 Vector

ArrayList와 Vector는 두 가지 모두 동적인 크기의 배열을 필요로 할 때 사용하는 클래스이다.
할 수 있는 기능은 거의 유사하지만 Vector는 동기화 되어 있다는 차이점이 있다.
동기화가 되어 있다는 의미는 Vector 객체에는 한번에 하나의 스레드만 접근이 가능하다는 것이다. 즉, 동기식 작업에만 사용할 수 있다는 점이다.

동기식을 쓰는이유?

현실세계로 보면 비동기식인 병렬처리로 일을 하는 것이 빠르고 좋을텐데 동기방식을 사용하는지 의문이 들 수도 있다.

동기식의 경우 위에서 언급했던 것처럼 작업의 흐름 파악이 쉽다.
다른 스레드에서 접근할 수 없기 때문에 안정적인 작업이 가능하다.
이를 Thread Safe 하다고 한다

대부분의 경우에는 ArrayList를 사용하지만 만약 멀티스레드 환경을 다룬다면 안전하게 Vector와 같은 동기화가 지원되는 클래스를 사용하는 것도 고려해야 할 것이다.


참고자료

참고1
참고2 - Java 비동기 동기