요즘 자료구조를 공부하는데 계속해서 나타나는 단어가 있습니다. 그게 바로 동기화 라는 단어인데 굉장히 유사한 기능을 가진 두 가지의 자료구조간의 차이점이 무엇인가 라고 찾아보았을 때 동기화 지원여부가 차이점인 경우가 종종 있었습니다. 여기에 포함되는 것이 ArrayList와 Vector, StringBuffer와 StringBuilder, HashMap과 HashTable의 경우가 제가 동기화 라는 단어를 접한 경우입니다.
각각의 차이점이 동기화 지원 여부라는 것은 이해를 하겠는데 그 동기화라는 것이 뭔지에 대해서 확실하게 이해를 하고 있지 않으니 자꾸 찝찝한 기분이 들었습니다. 그래서 정리를 해보려고 글을 써보기 시작했습니다. 일단 동기화를 이해하기 위해서는 쓰레드(Thread)라는 단어를 알아야 합니다. 쓰레드란 실행되고 있는 프로그램 이라고 볼 수 있는 프로세스의 내부에서 실행되는 흐름의 단위라고 볼 수 있습니다. 정리해보자면 Java가 실행되면 우리가 Java를 실행시킬 때 사용하는 main()로부터 main 쓰레드가 실행되며 이 main 쓰레드의 흐름이 곧 프로그램의 흐름이 되는 것 입니다.
위의 상황처럼 main 쓰레드만 있는 상황이라면 싱글 쓰레드를 사용하는 것으로 어렵지 않게 흐름을 예측할 수 있지만 자바는 멀티 쓰레드(multi thread)를 지원하는 언어입니다. 멀티 쓰레드와 싱글 쓰레드의 차이는 몇명의 사람이 일을 하느냐로 생각하면 편합니다. 싱글 쓰레드는 혼자서 일을 하는 것이고 멀티 쓰레드는 두 명 이상의 사람이 함께 일하는 것으로 이해할 수 있습니다.
위의 내용을 알고나서 동기, 비동기에 대해서 다시 알아보겠습니다.
동기방식은 요청과 결과가 항상 동시간에 발생하게 됩니다. 어떠한 요청을 받으면 그 요청에 대해서 얼마나 시간이 걸리던간에 결과를 받을 때까지 기다려야합니다. 아래와 같이 work1을 진행하고 있다면 도중에 work2 요청이 오더라도 work1이 끝나기 전까지는 작업을 시작할 수도 없습니다.
비동기 방식은 요청과 결과가 동시에 일어나지 않습니다. 아래 그림처럼 work1이 먼저 작업을 진행하고 있더라도 work2는 작업을 실행할 수 있으며 work1은 자신의 작업이 끝나면 그대로 결과를 반환하는 등 work1과 work2는 별개의 작업단위로 움직이게 됩니다.
이제 먼저 알아봤던 쓰레드의 이야기를 할 수 있습니다. 처음에 이야기가 나왔던 ArrayList와 Vector는 두 가지 모두 동적인 크기의 배열을 필요로 할 때 사용할 수 있는 클래스 입니다. 할 수 있는 기능은 거의 유사한데 Vector가 동기화 되어 있다는 차이점이 있습니다. 동기화 되어 있다는 의미는 Vector 객체에는 한번에 하나의 스레드만 접근이 가능하다는 것입니다. 즉 동기식 작업에만 사용할 수 있다는 것이죠.
그리고 여기까지 설명을 보면 현실 세계에서도 그렇고 대부분의 일을 할 때에는 비동기식 비슷하게는 병렬처리로 일을 하는 것이 빠르고 좋을 텐데 동기방식은 왜 사용되는지 의문이 생길 수 있습니다. 물론 동기 방식에도 장점이 있습니다.
동기식 작업의 장점
- 작업을 설계하거나 작업의 흐름에 대해서 파악하기 쉽습니다.
- 다른 스레드에서 접근할 수 없기 때문에 안정적인 작업이 가능합니다. (Thread Safe 스레드 안전)
물론 위의 장점을 가지고 있더라도 대부분은 Vector 보다는 ArrayList를 사용하지만 만약 멀티스레드 환경에서 개발을 해야할 일이 있다면 안전하게 Vector와 같은 동기화가 지원되는 클래스를 사용하는 것도 좋을 것 같습니다.
'Study > Java' 카테고리의 다른 글
[Java] HashMap remove, 객체, 참조 (0) | 2023.08.22 |
---|---|
[Java] java의 버전에 대해서 생각 (0) | 2022.02.10 |