multithread programming을 이용해 계좌 A에서 B로 이체 후, A와 B의 계좌 잔액을 들여다보는 프로그램을 만들어보자
Account 클래스
계좌 Account 클래스 생성
입금과 출금, 잔액을 보여주는 메소드 생성
public class Account {
String accountNo;
String ownName;
int bal;
Account(String accountNO, String ownName, int bal){
this.accountNo = accountNO;
this.ownName = ownName;
this.bal = bal;
}
void printAccount() {
System.out.println("계좌번호: " + accountNo);
System.out.println("예금주: " + ownName);
System.out.println("잔액: " + bal);
System.out.println();
}
void deposit(int amnt) {
bal += amnt;
}
int withdraw(int amnt){
if(amnt > bal)
return 0;
bal -= amnt;
return amnt;
}
}
공유 영역
계좌 A와 B가 공유할 영역 SharedArea 생성
public class SharedArea {
Account accnt1;
Account accnt2;
}
계좌이체 thread
A 계좌에서 B 계좌로 100만원씩 12번 입금하는 Transferthread 생성
계좌이체 부분은 임계영역(critical section)이므로 synchronized로 동기화
public class TransferThread extends Thread{
SharedArea sA;
public TransferThread(SharedArea area) {
sA = area;
}
public void run() {
for(int i=0; i<12; i++) {
synchronized (sA) { //동기화 (임계영역)
sA.accnt1.withdraw(100);
System.out.println("A 계좌 : 100만원 인출");
sA.accnt2.deposit(100);
System.out.println("B 계좌 : 100만원 입금");
}
}
}
}
잔액 확인 thread
A와 B의 계좌 잔액의 합을 출력하는 PrtThread 작성
임계 영역을 synchronized로 동기화
public class PrtThread extends Thread{
SharedArea sA;
public PrtThread(SharedArea area) {
sA = area;
}
public void run() {
for(int i=0; i<3; i++) {
synchronized (sA) { //동기화 (임계영역)
int sum = sA.accnt1.bal + sA.accnt2.bal;
System.out.println("계좌 잔액 합계 : " + sum);
}
}
}
}
Main
public class MultiThreadExam05 {
public static void main(String[] args) {
SharedArea area = new SharedArea();
area.accnt1 = new Account("111", "A", 2000);
area.accnt2 = new Account("222", "B", 1000);
TransferThread th1 = new TransferThread(area);
PrtThread th2 = new PrtThread(area);
th1.start();
th2.start();
}
}
TransferThread와 PtrThread 모두 임계 영역을 동기화하였기 때문에 계좌 잔액 합계가 3번 모두 3000으로 고정되게 출력됨.
만약 동기화를 하지 않았다면 계좌이체가 진행되던 중, 즉 A에서 10만원을 인출하고 B에 입금하기 직전에 PtrThread가 계좌 잔액 합계를 출력한다면 잔액이 2900일 수 있다.
'Java' 카테고리의 다른 글
[Java] Multithread Programming (0) | 2022.12.18 |
---|---|
[Java] Vector (0) | 2022.12.18 |
[Java] 제네릭 프로그래밍, ArrayList (0) | 2022.12.18 |
[Java] 패키지 (0) | 2022.12.04 |
[Java] Interface - 도서 관리 프로그램 (0) | 2022.12.04 |