본문 바로가기

강좌/JAVA THREAD

자바 쓰레드(Thread) - 쓰레드(Thread)의 동기화 (synchronized) 화장실 예제

첫번째 동기화 예제를 보자

냄새는 나지만 화장실 예제다.

보통 집에는 화장실이 한개 혹은 두개다.(뭐 갑부라면 가족 한명당 한개씩 있을수도 있지만)

한개라고 치자.


그러면 아침에 일어나서 한명이 들어가면 나머지 구성원은 그 한명이 나올때까지 기달려야 한다.


예제를 보자


<메인메소드가 있는 메인 클래스>



<가족에 대한 클래스 쓰레드를 상속 받는다>


<화장실 클래스>

- 가족클래스에서 호출되어서 openDoor를 호출하면 입장하고 for로 일정시간 일(?) 보는 작업을 한다.



<결과>

결과를 보자 아버지가 입장하고 끄으응을 할때쯤 엄마가 입장하고 말았다..

그리고 나서 끄으응 할때쯤 아버지가 다 했다..이렇게 되면 현재 화장실에 두명이 일보고 있는것이다.

그 뒤로 여동생이 들어오고..등등.순서가 차례차례로 가야 할것이 마구마구 사람들이 순서 없이 들어 온다.

결국 동기화 처리가 되지 않는 것이다.


동기화 처리를 위해서 플래그를 두어서 플래그를 확인하면서 들어 갈 수도 있지만 효율적이지 않다.


synchronized 키워드를 이용하면 쉽게 해결 할 수있다.

화장실 클래스의 openDoor 시그니쳐를 public synchronized void openDoor(String name)으로 바꾸고

다시 실행해 본다.



결과를 보면 차례차례 화장실을 사용하고 있다.