고급 JAVA

JAVA - 쓰레드 예제 - 은행 입출금 -synchronized

햄찌개 2020. 9. 23. 19:34

 * 은행의 입출금을 쓰래드로 처리하는 에제
 * (synchronized를 이용한 동기화 처리)

 

public class T16_StncAccountTest {

	public static void main(String[] args) {
		SyncAccount sAcc = new SyncAccount();
		sAcc.setBalance(10000);//입금처리
		
		BankThread th1 = new BankThread(sAcc);
		BankThread th2 = new BankThread(sAcc);
		
		th1.start();
		th2.start();
	}

}

//은행의 입출금을 관리하는 클래스 정의
class SyncAccount{
	private int balance;	//잔액이 저장될 변수

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}
	
	
	//입금 처리를 수행하는 메서드 
	public synchronized void deposit(int money) {
		balance+= money;
		
	}
	//출금을 처리하는 메서드(출금성공 : true, 출금실패 : false반환)
	//동기화 영역에서 호출하는 메서드도 동기화 처리를 해 주어야 한다.
	synchronized public boolean withdraw(int money) {
		if(balance >= money) {
			for (int i = 1; i <= 1000000000; i++) {};//시간 지연
				balance -=money;
				System.out.println("메서드 안에서 balance ="+getBalance());
			return true;
		}else {
			return false;
		}
	}
}

//은행 업무를 처리하는 쓰레드 
class BankThread extends Thread{
	private SyncAccount sAcc;

	public BankThread(SyncAccount sAcc) {
		this.sAcc = sAcc;
	}
	@Override
	public void run() {
		boolean result = sAcc.withdraw(6000); //6000원 인출
		System.out.println("쓰레드 안에서  result =" +result+", balance ="+sAcc.getBalance());
		
	}
	
}