[Java] Thread - 은행 계좌 입출금에 대한 동기화 기능 구현

2023. 2. 19. 02:01·Java/Base
728x90
728x90

코드

#  클래스 파일 

public class BankAccount {
    int money = 100_000;

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    // 입금
    // synchronized 메서드
    public synchronized void saveMoney(int money) {
        int currentMoney = getMoney();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        setMoney(currentMoney + money);
        System.out.println("입금 후 계좌 잔액 : " + getMoney());
    }

    // 출금
    public int widthDraw(int money) {

        // synchronized 블록 (메서드나 블록 둘 중 하나 선택)
        // 블록 내 코드에 동기화를 진행함
        synchronized (this) {
            int currentMoney = getMoney();

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (currentMoney >= money) {
                setMoney(currentMoney - money);
                System.out.println("출금 후 계좌 잔액 : " + getMoney());
                return money;
            // 현재 계좌 잔액보다 더 많은 금액을 출금하려고 하면
            } else {
                System.out.println("잘못된 입력입니다.");
                return 0;
            }			
        }
    }
}

// 쓰레드 클래스 1
class Father extends Thread {
    BankAccount account;

    public Father(BankAccount account) {
        this.account = account;
    }

    @Override
    public void run() {
        // 입금 시키기
        account.saveMoney(10_000);
    }
}

// 쓰레드 클래스 2
class Mother extends Thread {
    BankAccount account;

    public Mother(BankAccount account) {
        this.account = account;
    }

    @Override
    public void run() {
        // 출금 시키기
        account.widthDraw(5_000);
    }
}

#  실행 파일

public static void main(String[] args) {

    BankAccount bankAccount = new BankAccount();
    Father father = new Father(bankAccount);
    Mother mother = new Mother(bankAccount);

    // 아버지 입금하기
    father.start(); // 3초 걸림

    // 어머니 출금하기
    mother.start();
}

 

실행

 

320x100
반응형
저작자표시 비영리 변경금지 (새창열림)

'Java > Base' 카테고리의 다른 글

[Java] 컬렉션 프레임워크 (List, Set, Map)  (0) 2023.02.22
[Java] 자료 구조  (0) 2023.02.21
[Java] 쓰레드 (Thread)  (0) 2023.02.19
[Java] 제네릭 (Generic)  (0) 2023.02.17
[Java] 내부 클래스와 익명 클래스  (1) 2023.02.16
'Java/Base' 카테고리의 다른 글
  • [Java] 컬렉션 프레임워크 (List, Set, Map)
  • [Java] 자료 구조
  • [Java] 쓰레드 (Thread)
  • [Java] 제네릭 (Generic)
스응
스응
    반응형
    250x250
  • 스응
    이서영의 개발 블로그
    스응
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (385)
      • Java (134)
        • Base (54)
        • Spring Boot (37)
        • JSP (16)
        • Swing (GUI) (20)
        • Design Pattern (7)
      • C# (13)
      • PHP (18)
      • SQL (27)
      • Vue.js (9)
      • Tailwind CSS (4)
      • TypeScript (7)
      • HTML & CSS (27)
      • JavaScript (26)
      • jQuery (10)
      • Android (3)
      • - - - - - - - - - - - - - - (0)
      • Hotkeys (5)
      • CS (30)
      • IT Notes (13)
      • Error Notes (17)
      • Team Project (24)
        • Airlines Web Project (12)
        • University Web Project (6)
        • Strikers 1945 GUI Project (6)
      • My Project (18)
        • Library Web Project (8)
        • Pet Shopping Mall GUI Project (10)
      • etc. (0)
  • 블로그 메뉴

    • Home
    • Write
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    개발일지
    php
    Android
    errorNote
    SpringBoot
    오블완
    C#
    티스토리챌린지
    Swing
    Wordpress
    Codeigniter
    vuejs
    typeScript
    HTML
    java
    tailwindcss
    면접
    http
    jQuery
    js
    jsp
    SQL
    cs
    git
    zapier
    CSS
    SWAGGER
    SEO
    Hotkeys
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
스응
[Java] Thread - 은행 계좌 입출금에 대한 동기화 기능 구현
상단으로

티스토리툴바