쓰레드의 동기화
쓰레드 동기화(Thread Synchronization)는 여러 개의 쓰레드가 공유 자원에 동시에 접근할 때 발생할 수 있는 문제를 방지하는 기법입니다. 이를 통해 데이터의 일관성을 유지하고, 예상치 못한 동작을 방지할 수 있다.
임계 영역(critical section)
여러 쓰레드들중 동시 접근하였을때 오직 한 쓰레드만을 허용해주는 기법.
임계 영역을 보호하는 방법
1) 뮤텍스(Mutex)
한 번에 하나의 스레드만 접근 가능하도록 잠금(lock) 기능을 제공.
2) 세마포어(Semaphore)
여러 개의 스레드가 접근할 수 있지만, 최대 허용 개수를 제한.
3) 모니터(Monitor) 및 락(Lock)
특정 코드 블록을 보호하여 한 번에 하나의 스레드만 실행되도록 함.
임계 영역의 조건
1) 상호 배제(Mutual Exclusion): 한 번에 하나의 스레드만 접근 가능.
2) 진행(Progress): 임계 영역에 접근하려는 스레드가 있을 경우, 적절한 스레드가 선택되어야 함.
3) 한정 대기(Bounded Waiting): 특정 스레드가 무한히 기다리지 않도록 보장.
synchronized를 이용한 동기화
1. 메서드 전체를 임계 영역으로 지정
쓰레드는 synchronized메서드가 호출된 시점부터 해당 메서드가 포함된 객체의 lock을 얻어 작업을 수행하다가 메서드가 종료되면 lock을 반환한다.
2. 특정한 영역을 임계 영역으로 지정
synchronized(참조변수) { } 으로 메서드안 특정영역을 동기화 처리하는 기법으로 이때 참조변수는 락을 걸고자하는 객체를 참조하는 것이어야 한다. synchronized 블럭 안으로 들어가면서 쓰레드는 지정된 객체의 lock을 얻게 되고, 이 블럭을 벗어나면 lock을 반납한다.
임계영역은 멀티쓰레드 프로그램의 성능을 좌우하기 때문에 가능하면 메서드 전체에 락을 거는 것보다 synchronized블럭으로 임계 영역을 최소화해서 보다 효율적인 프로그램이 되도록 노력해야 한다.