데이터 동기화와 비동기 처리는 멀티 스레드 환경에 대해서 공부하다보면 많이 접할 수 있는 용어입니다. 이 용어들에 대한 개념들을 명확하기 위해 포스팅을 해보려 합니다.
동기화
동기화는 여러 스레드가 공유하는 데이터에 대한 접근을 조절하여 데이터의 일관성과 안정성을 보장하는 것을 의미합니다. 동기화를 사용하면 한 스레드가 공유 자원을 사용할 때 다른 스레드가 동일한 공유 자원에 접근할 수 없도록 통제하는 것을 말합니다. 동기화는 `상호 배제`를 통해 데이터 경쟁 상태를 방지합니다. 상호 배제 방법으로 뮤텍스, 세마포어 방식이 사용됩니다.
경쟁 상태: 멀티스레드 환경에서 두 개 이상의 스레드가 공유 자원에 접근하여 동시에 변경하려고 할 때 발생하는 문제, 데이터 일관성과 안정성이 보장되지 않습니다.
임계 영역: 동시에 여러 스레드가 접근하는 경우 문제가 발생할 수 있는 코드 영역입니다.
뮤텍스(Mutex)
- 상호 배제를 위한 잠금 매커니즘입니다.
- 뮤텍스는 스레드가 임계 영역에 진입할 때(공유 자원을 사용할때) Lock을 걸고, 나올 때 Lock을 해제하여 임계 영역에 한 번에 하나의 스레드만이 접근할 수 있도록 합니다.
- 이때 Lock을 건 스레드만이, Lock을 해제할 수 있습니다.
- 공유 자원을 이미 사용 중인 스레드가 있는 경우, 다른 스레드가 공유 자원에 접근 시 대기 큐에서 대기하게 됩니다.
세마포어(Semaphore)
- 특정 개수(n)의 자원을 동시에 제어하기 위한 동기화 방법입니다.
- n 개의 공유 자원에 대한 접근을 제한할 수 있으며 이를 세마포어 변수라고 합니다.
- 스레드는 세마포어의 값을 확인하고, 획득하거나 해제하는 작업을 수행합니다.
- n을 1로 설정하였을 때 이진 세마포어로 뮤텍스와 같다고 할 수 있습니다.
- Lock을 걸지 않은 스레드도, Signal을 보내 Lock을 해제할 수 있습니다.
- 세마포어는 여러 스데그 간의 협력과 자원 제한을 위해 사용됩니다.
Monitor
Monitor 동기화 방법은 프로그래밍 언어 수준에서 제공되는 동기화 방법입니다. 일반적으로 모니터는 고급 프로그래밍 언어에서 제공되는 라이브러리나 키워드를 사용하여 임계 영역을 지정하고 스레드 간의 동기화를 달성합니다.
Java에서는 `synchronized` 키워드를 사용하여 모니터 동기화를 구현할 수 있습니다.
Synchronized
Java에서는 `synchronized` 키워드를 이용해 스레드 동기화를 합니다.
Java의 모든 객체는 내부적으로 Monitor를 가지며, Monitor는 객체의 잠금(lock)과 관련된 정보를 갖고 있습니다. 객체의 Monitor는 하나의 스레드만이 접근할 수 있도록 잠금(lock)을 걸어 다른 스레드가 해당 객체에 접근하지 못하도록 합니다.
`synchronized` 키워드를 통해 임계 영역을 지정하면, 해당 영역은 하나의 스레드만이 접근할 수 있는 동기화 영역이 됩니다. 다른 스레드가 동기화된 영역에 접근하려 하면 해당 스레드는 대기하고 있어야 합니다.
Synchronized에 대한 예시를 확인하고 싶으면 다음 링크를 참고하시면 됩니다.
https://yeo-computerclass.tistory.com/23
비동기 처리
비동기 처리는 작업을 백그라운드 스레드에서 실행하고, 결과를 나중에 가져와 사용할 수 있게 해주는 방식입니다. 이를 통해 작업의 동시성과 성능을 향상시킬 수 있습니다. 이러한 장점 때문에 네트워크 통신이나 I/O 작업 같은 시간이 오래 걸리는 작업에 적합합니다. 비동기 처리는 병렬성을 통해 성능을 향상시킬 수 있지만, `동기화` 없이 여러 스레드가 동시에 데이터를 수정하는 경우 데이터의 무결성이 깨질 수 있습니다. 따라서 `비동기 처리`를 할때 `동기화`를 통해 공유 자원에 대한 접근을 제어하고, 경쟁 상태를 방지하여, 데이터의 일관성과 안정성을 보장해주어야 합니다.
Java에서 비동기 처리하는 방식은 `Executor`, `Callable`, `Runnable`, `Future` 등 여러 가지가 있습니다. 이에 대한 자세한 설명을 확인하고 싶으면 다음 링크를 참고하시면 됩니다.
https://yeo-computerclass.tistory.com/469
'Java' 카테고리의 다른 글
Java try-wtih-resources로 자원 관리하기 (0) | 2023.06.23 |
---|---|
Java 소켓 프로그래밍: 네트워크 통신을 위한 Java Socket (0) | 2023.06.23 |
JAVA ThreadPoolExecutor을 이용한 스레드 풀(Thread Pool) (0) | 2023.05.25 |
Optional이란? (0) | 2022.12.05 |
Java 스트림(Stream) 정리 (0) | 2022.12.05 |