[Java] Java에서 동기화 및 상호배제 방식에 대해서 말씀해주세요.
CMSSKKK opened this issue · 1 comments
Java에서 동기화 및 상호배제 방식에 대해서 말씀해주세요.
키워드
ex) 모니터
, 세마포어
, 뮤텍스
뮤텍스와 세마포어에 대한 설명은 생략합니다.
멀티스레드에서의 동시성 문제를 해결하는 방식과 관련해서는 Synchronized, Atomic연산, volatile, Concurrent 라이브러리 활용이 있습니다.
그 중에서도 Java에서 대표적인 스레드 동기화 및 상호배제 방식은 Synchronized
키워드의 활용이며, 그 내부 동작은 Monitor
를 활용합니다. Concurrent 라이브러리 내의 자료구조 동작에서도 Synchronized
를 활용합니다.
세마포어에서는 wait & signal 연산 순서를 바꿔서 실행하거나 둘 중 하나라도 생략하면 상호 배제를 위반하게 되어 데드락이 발생합니다. 또한 만약 wait & signal 연산이 프로그램 전체에 구성되어 있으면, 세마포어의 영향이 미치는 곳이 어딘지 파악하기 파악하기 어렵기 때문에 세마포어를 사용해 프로그램을 구현하는 것은 매우 어렵습니다.
뮤텍스 또는 세마포어만의 활용으로는 상호배제를 완벽하게 완성할 수 없기에 지원된 것이 Monitor입니다.
모니터는 상호배제를 프로그램으로 구현한 것으로 이진세마포어(임계구역에 하나의 스레드만 접근 가능하도록 함)만이 가능합니다.
모니터는공유 자원
과 공유 자원 접근함수
로 이루어져 있습니다.
또한 상호 배타 큐
와 조건 동기 큐
를 가지고 있습니다.
상호 배타 큐는 하나의 스레드만 공유 자원에 접근할 수 있도록 하는 큐이며, 공유 자원에 접근한 스레드가 큐에 존재하게 됩니다.
조건 동기 큐는 공유 자원에 접근하고 있는 스레드가 있는 상황에, 공유 자원에 접근하고자하는 스레드가 존재하는 대기 큐입니다.
자바의 모니터는 모든 인스턴스들이 가지고 있으며, 모니터를 통해서 스레드 동기화를 진행합니다.
모니터 라이프 사이클은 Synchronized 키워드에 의존하기 때문에, wait(), nofify()
등 과 같은공유 자원 접근 함수는 Synchronized 블록 내부에서만 의미있게 동작합니다.
References
https://steady-coding.tistory.com/557
https://velog.io/@cmsskkk/%EB%B3%91%ED%96%89%EC%A0%9C%EC%96%B41-%EB%B0%9C%ED%91%9C%EC%9E%90%EB%A3%8C