동기화를 하는 이유:
- 공유된 자원을 단순 처리속도로 수행하게 되면, 실질적인 자원이 없음에도 불구하고 먼저 수행을 해버리고 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();
}
}
'개발자노트' 카테고리의 다른 글
Resource를 JAVA로 불러오기 (FileInputStream) (0) | 2022.06.27 |
---|---|
반복문 for / for each + 컬렉션 [Iterator] (0) | 2022.06.27 |
스레드 [Thread]의 기본사용법 (0) | 2022.06.24 |
스레드[Thread]의 기본원리 (0) | 2022.06.24 |
예외처리 - 나만의 예외 만들기 (0) | 2022.06.24 |