본문 바로가기

개발자노트

스레드 [Thread] 의 동기화(synchronized) - 티켓팅 예제

동기화를 하는 이유:

- 공유된 자원을 단순 처리속도로 수행하게 되면, 실질적인 자원이 없음에도 불구하고 먼저 수행을 해버리고 discount를 나중에 하게 된다면 , 복잡한 일이 많이 생길 것이다.

- 극단적인 예로 은행에서의 현금인출과 티켓팅이 있을 것인데, 티켓팅에 대한 예제를 살펴볼 것이다.

package class05;

// [동기화]
//  : 공유자원을 어떤 스레드가 점유하고있을때,
//    다른 스레드의 접근을 막는 것
class Person implements Runnable {
	Ticketting t = new Ticketting();

	@Override
	public void run() {
		t.pay();
	}
}

class Ticketting {
	static int ticket = 2; // 클래스 변수==공유자원

	synchronized void pay() { // 동기화, 다른 스레드의 접근을 막는 것
		if (ticket > 0) {
			System.out.println(Thread.currentThread().getName() + "구매성공!"); //게터는 프라이빗 된 멤버변수를 가져올 수 있게끔 
			ticket--;
		} else {
			System.out.println(Thread.currentThread().getName() + "구매실패ㅠㅠㅠ"); //게터는 프라이빗 된 멤버변수를 가져올 수 있게끔 
		}
		System.out.println("남은티켓: " + ticket);
	}
}

public class Test07 {
	public static void main(String[] args) {
		Person person = new Person();
		Thread t1 = new Thread(person, "홍길동");
		Thread t2 = new Thread(person, "아무무");
		Thread t3 = new Thread(person, "티모");

		t1.start();
		t2.start();
		t3.start();
	}
}