// education

자바 멀티스레딩(Multithreading)과 동시성 제어

하나의 프로세스 내에서 여러 작업을 동시에 병렬로 실행하는 멀티스레딩(Multithreading) 기술과 공유 자원 충돌을 방지하는 동시성(Concurrency) 동기화를 배웁니다.


1. 멀티스레딩 용어 사전 (Glossary)


2. 동기화(synchronized) 계좌 잔액 차감 실습

class BankAccount {
    private int balance = 1000;

    // synchronized 키워드로 동시 접근 차단
    public synchronized void withdraw(int amount) {
        if (balance >= amount) {
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            balance -= amount;
            System.out.println(Thread.currentThread().getName() + " 출금 완료. 남은 잔액: " + balance + "원");
        } else {
            System.out.println(Thread.currentThread().getName() + " 출금 실패 (잔액 부족)");
        }
    }
}

public class ThreadSyncMain {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();

        // 2개의 스레드가 동일 계좌에서 동시에 출금 시도
        Runnable task = () -> account.withdraw(700);

        Thread t1 = new Thread(task, "사용자 A");
        Thread t2 = new Thread(task, "사용자 B");

        t1.start();
        t2.start();
    }
}

3. 자주 묻는 질문 (Q&A)

Q. Thread 클래스를 상속받는 것과 Runnable 인터페이스를 구현하는 것의 차이는? A. 자바는 단일 상속만 지원하므로 Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없게 됩니다. 따라서 코드의 유연성과 재사용성을 위해 Runnable 인터페이스 구현 방식이 권장됩니다.

← 이전스트림 API(Stream API)를 활용한 데이터 파이프라인 다음 →자바 GUI 스윙(Swing) 컴포넌트와 이벤트 처리