개발자노트
스레드 [Thread] 의 동기화(synchronized) - 티켓팅 예제
hansummer
2022. 6. 24. 16:40
동기화를 하는 이유:
- 공유된 자원을 단순 처리속도로 수행하게 되면, 실질적인 자원이 없음에도 불구하고 먼저 수행을 해버리고 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();
}
}