맞는데 왜 틀릴까..?

Java

[Java] Multithread Programming 2 - multiBank

안도일 2022. 12. 18. 17:37

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