DevBoi

[Java] 모니터 본문

Language/[Java]

[Java] 모니터

HiSmith 2022. 4. 8. 13:02
반응형

하나의 객체마다 하나의 모니터를 결합할 수 있다.

모니터가 결합된 객체는 동시에 두개 이상의 스레드에 의해 접근 할 수 없도록 막는 잠금 기능을 제공한다.

객체에 모니터를 결합하면 하나의 스레드가 그 데이터를 사용하는 동안, 다른 스레드 들이 그 데이터를 사용할 수 없다.

 

자바에서는 동기화 메소드가 선언된 객체와 동기화 블럭에 의해 동기화 되는 모든 객체에 고유한 모니터가 결합이 되어

동기화 작업을 수행한다.

 

모니터의 구성

-스레드 단위로 모니터락을 획득하거나 반환한다.

-동기화 코드를 수행할 때는 동기화 대상 인스턴스와 결합된 모니터락을 획득한 후에 진입이 가능하며, 동기화 코드를 벗어날 때에는 모니터 락을 반환하게 된다.

-동기화 대상 인스턴스 별로 이와 결합된 Monitor가 존재하며, 현재 락을 획득한 스레드와 Lock count 정보 관리를 한다.

-모니터가 Lock Count 정보를 유지한다는 것은 동일 스레드가 중복해서 lock을 걸수 있다는 의미이다.

 

 

진입 셋

모니터락을 기다리는 스레드를 담아두기 위한 자료 구조

 

대기 셋

모니터가 nofity해줄 때까지 기다리는 스레드를 담는 구조

 

한 스레드가 동기화 코드 영역에 접근하기 위해, Entry Set에 들어간다.

모니터락을 소유한 스레드가 있다면, 해당 스레드가 모니터락을 반환할때까지 엔트리 셋에서 대기한다.

동기화 영역을 벗어나면서 소유했던 모니터락을 반환다.

 

 

 

 

 

1. 한 스레드가 모니터락을 획득, 동기화 코드 영역에 진입한다 (Runnable 상태)

2. 조건이 만족되지 않아 현재 스레드를 대기 시키면, 해당 스레드는 소유한 모니터락을 반환후, WaitSet에서 대기한다.

락 반환이유는 조건이 만족되기 위해 다른 스레드가 임계영역에서 작업을 해줘야하기 때문이다.

(Runnable -> waiting)

3. 다른 스레드가 모니터락을 획득, 동기화 코드영역에 진입, 작업을 수행한 후 WaitSet에서 대기중인 스레드에게 

notify()로 신호를 보낸다.

4. waitSet에서 대기하던 스레드는 신호를 받고, Entry Set으로 옮긴다.

5.동기화 코드 영역을 벗어나면, 모니터락을 반환하고, EntrySet에서 대기하던 스레드 중 하나의 스레드가 선택되어 모니터락을 얻고 실행된다.

선택된 스레드는 (Runnable, 나머지 미 선택, 아직 엔트리 셋에서 기다리는건 BLocked상태이다.)

 

 

자바에서는 synchronized가 붙으면 동기화 되는 모든 객체에 모니터가 결합 된다.

모니터가 결합된 객체는 다른 스레드들이 동시에 접근 할 수없다.

스레드는 모니터락을 획득해야 접근이 가능하고, 동기화 영역을 벗어나면, 모니터락을 반환한다.

 

 

 

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] finalize 메서드 사용 및 메모리 점유  (0) 2022.04.28
[Effective Java] Rules  (0) 2022.04.21
[Java] 문맥 교환  (0) 2022.04.08
[Java] 멀티 쓰레드란  (0) 2022.04.08
[Java] Restful API  (0) 2022.04.07