JAVA/코드

과제 2번 - Thread 와 동기화

record2080 2025. 1. 22. 01:25

가족 공동 계좌가 있습니다.
만원 저금이 되어있습니다.
예) 엄마 / 아빠 / 동생 / 나
1000  2000  3000  5000
동기화 처리를 하셔서,
돈이 정상적으로 출금될수있도록 코딩해주세요.

한글코딩(개요위주)
돈을 인출하려고 한다. 
가족 공동 계좌는 가족이라면 계좌이용 가능
계좌에는 만원이 들어있고 모든 가족이 접근이 가능하기 때문에 공유자원
쓰면 줄어드는 자원이기 때문에 마이너스가 되면 공유자원을 이용하지 못한다
(동기화가 필요=>마이너스가 되어도 인출이 가능해지는 사고를 막기위해 )

돈이 정상적으로 출력하려면
만약 엄마가 1000원을 사용했을 때(10000-1000=9000)
      아빠가 2000원을 사용했을 때(9000-2000=7000)
      동생이 3000원을 사용했을 때(7000-3000=4000)
        내가 5000원을 인출하려고 하면 인출이 되면 안된다


 

 

 

 

 

package pratict01;

import java.util.Scanner;

class FamilyAccount {
	static int money=10000;
	Scanner sc=new Scanner(System.in);
	
	synchronized void draw() {
		if(FamilyAccount.money<=0) {
			System.out.println("출금할 수 없습니다");
			return;
		}
		System.out.println("얼마를 인출하시겠습니까?>>");
		int amount=sc.nextInt(); //인출할 돈
		if(amount>FamilyAccount.money) {
			System.out.println("잔액이 부족합니다");
			return;
		}
		money-=amount;
		System.out.println(amount+"원이 출금되었습니다. 현재 잔액"+money);
		
	}
}
class FamilyMember extends Thread {//스레드 클래스에는 계좌와 가족멤버이름이 필요
	private FamilyAccount account;//클래스 패밀리계좌의 계좌(이름)
	private String name;//계좌접근 막기위해 멤버변수 프라이빗
	//초기화 위해 생성자
	FamilyMember(FamilyAccount account, String name) {
		this.account = account;
		this.name = name;
	}
	@Override
	public void run() {//출금하려고 할 때
		System.out.println(name+"가 (이) 출금하려고 합니다");
		account.draw();

	}

}
public class Pratice2 {
	public static void main(String[] args) {
		FamilyAccount account=new FamilyAccount();//계좌객체 생성

		//가족구성원 스레드 생성
		FamilyMember mom=new FamilyMember(account,"엄마");
		FamilyMember dad=new FamilyMember(account,"아빠");
		FamilyMember bro=new FamilyMember(account,"동생");
		FamilyMember me=new FamilyMember(account,"나");

		//출금시도=스레드동작
		mom.start();
		dad.start();
		bro.start();
		me.start();
		
		  System.out.println("최종 잔액>> " + FamilyAccount.money + "원");
	}

}

 



심화) 누가 얼마를 출금했습니다.
남은 금액은 ㅇㅇㅇ원입니다.
누가 얼마를 출금실패했습니다.
남은 금액은 ㅇㅇㅇ원입니다.