엄마와 아들이 ATM을 통하여 1000원씩 꺼내갈려고 한다.
한 쪽만 독점하지 않고 서로 돌아가면서 뽑을려면 스레드를 잘 써야한다.
동기화(Synchronized)
: 보내고 받는 영역이 서로 okay 되면 전송하고 받음
임계 영역을 지정하기 위해 동기화 메소드와 동기화 블록 제공 -> 스레드 내부에 동기화 존재 시 객체 잠금 걸어 다른 스레드가 임계 영역 코드를 실행하지 못함
synchronized -> 인스턴스, 정적 메소드 어디든 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
class ATM implements Runnable {
private long depositeMoney = 10000;
public void run() {
synchronized (this) { //동기화 사용하기 위해
for (int i = 0; i < 10; i++) {
try {
notify(); //실행 대기 상태로
Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace(); }
if (getDepositeMoney() <= 0) //여기서 wait()으로 잠들기 전에 금액 -되면 break로 나갈 수 있도록
break;
try {
wait(); //if에서 안걸리면 wait(), 걸리면 나갈 수 있도록
} catch (InterruptedException e1) {e1.printStackTrace();}
//일시 정지 상태로
withDraw(1000);
}
}
}
public void withDraw(long howMuch) {
if (getDepositeMoney() > 0) {
depositeMoney -= howMuch;
System.out.print(Thread.currentThread().getName() + " , ");
System.out.print("잔액 : "+ getDepositeMoney()+"\n");
} else {
System.out.print(Thread.currentThread().getName() + " , ");
System.out.println("잔액이 부족합니다.");
}
}
public long getDepositeMoney() {
return depositeMoney;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
'JAVA' 카테고리의 다른 글
제네릭 예제 (0) | 2019.06.20 |
---|---|
제네릭 (0) | 2019.06.20 |
멀티 스레드 예제_priority (0) | 2019.06.20 |
멀티 스레드 예제_yield (0) | 2019.06.20 |
멀티 스레드 예제_join() (0) | 2019.06.19 |