동기(synchronous: 동시에 일어나는)
- 동기는 말 그대로 동시에 일어난다는 뜻이다. 요청과 그 결과가 동시에 일어난다는 약속이다.
- 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 한다.
- 요청한 결과가 한자리에서 동시에 일어남
- A노드와 B노드 사이의 작업 처리 단위(transaction)을 동시에 맞추겠다.
장점: 설계가 매우 간단하고 직관적
단점: 결과가 주어질 때까지 아무것도 못하고 대기해야 한다.
비동기(Asynchronous: 동시에 일어나지 않는)
- 비동기는 동시에 일어나지 않는다는 의미이다. 요청한 결과는 동시에 일어나지 않을거라는 약속이다.
- 요청한 그 자리에서 결과가 주어지지 않는다.
- 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.
장점: 결과가 주어지는데 시간이 걸리더라도 그 시간 동안에 다른 작업을 할 수 있으므로 자원들을 효율적으로 사용 할 수 있다.
단점: 동기보다 복잡한 설계
동기와 비동기의 예
동기방식
- 요청이 들어온 순서에 맞게 하나씩 처리하는 방식이다.
- 설계가 매우 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 못하고 대기해야하는 단점이 있다.
비동기 방식
- 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식이다.
- 여러 개의 요청을 동시에 처리할 수 있는 장점이 있지만 동기 방식보다 속도가 떨어질 수도 있다.
동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있다.
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와 같은 동기화가 지원되는 클래스를 사용하는 것도 고려해야 할 것이다.
참고자료
'CS' 카테고리의 다른 글
REST, REST API 제데로 알아보자 (0) | 2023.10.17 |
---|---|
로드밸런서(Load Balancer)란? (0) | 2023.10.13 |
프로세스 스레드 (0) | 2023.10.13 |
AXIOS가 뭐하는 녀석인지? - 비동기 통신, Promise, Ajax, HTTP, (0) | 2023.02.16 |