JAVA 유용한 클래스

(JAVA)자바 multi-threading 이란 - 6

mynote6676 2025. 4. 25. 18:30

1. 자바에서 멀티 스레딩(Multi-threading)에 대해 알아 보자.

 

자바에서 멀티 스레딩(Multi-threading)은 프로그램의 여러 부분이 동시에 실행되도록 하는 기술입니다. 이

를 통해 자원의 효율적 사용과 응용 프로그램의 반응성 향상을 달성할 수 있습니다. 멀티 스레딩은 하나의 프

로세스 내에서 여러 개의 스레드를 생성하여  각 스레드가 작업을 수행하도록 함으로써 병렬 처리를 가능하게 

합니다.

 

정리

-여러 thread가 동시에 수행되는 프로그래밍, 여러 작업이 동시에 실행되는 효과

-thread는 각각 자신만의 작업 공간을 가짐(call stack)

각 thread 사이에서 공유하는 자원이 있을 수 있음(자바에서는 static instance)

-여러 thread가 자원을 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생

할 수 있음

-이렇게 여러 thread 가 공유하는 자원중 경쟁이 발생하는 부분을 critical section이라고 함

 

 

 

 

 

 

 

-citical section에 대한 동기화(일종의 순차적 수행)를 구현하지 않으면 오류가 발생할 수 있음

 

 

시니리오 코드 1

 

각 스레드가 공유하는 자원 만들어 보기 (sharedResource 상황을 구현해 보자)

package thread;

/**
 * 각 스레드가 공유하는 자원 만들어 보기(Shared Resource) - 공유 자원
 */
public class BankAccount {

    private int money = 100_000;

    public int getMoney() {
        return money;
    }

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


    // 입금
    public synchronized void deposit(int money) {
      int currentMoney = getMoney();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        // this.money += money;
        //       10   +  1 = 11
        setMoney(currentMoney + money);
        System.out.println("ATM 현재 잔액(입금) : " + getMoney());
    }

    // 출금
    public synchronized int widthDraw(int money) {
        int currentMoney = getMoney();

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        
        // 방어적 코드 
        if(currentMoney < money) {
            System.out.println("잔액이 부족합니다");
            return 0;
        } else {
            setMoney(currentMoney - money);
            System.out.println("ATM 현재 잔액(출금) : " + getMoney());
            return 0;
        }
    }
}

package thread;

public class Father extends Thread{
    //입금 요총 --->3초
    BankAccount bankAccount;

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

    @Override
    public void run() {
        //계좌 입금요청---3초걸림 Thread로 구성
        bankAccount.deposit(10000);
    }
}

 

 

package thread;

public class Mother extends Thread{

    BankAccount bankAccount;

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

    @Override
    public void run() {
        //계좌에 출금요청 0.5초걸림
        bankAccount.widthDraw(5_000);
    }
}
728x90