하나의 프로세스 내에서 여러 작업을 동시에 병렬로 실행하는 멀티스레딩(Multithreading) 기술과 공유 자원 충돌을 방지하는 동시성(Concurrency) 동기화를 배웁니다.
1. 멀티스레딩 용어 사전 (Glossary)
- Process (프로세스): 운영체제로부터 독립된 메모리를 할당받아 실행 중인 프로그램 단위입니다.
- Thread (스레드): 프로세스 내부에서 실행되는 제어의 흐름 단위로, Stack 영역만 별도로 갖고 Heap 메모리는 공유합니다.
- Critical Section (임계 영역): 둘 이상의 스레드가 동시에 접근하면 문제가 발생하는 공유 자원 코드 구역입니다.
- Synchronized (동기화): 한 스레드가 임계 영역에 진입했을 때 모니터 락(Monitor Lock)을 획득하여 다른 스레드의 접근을 차단하는 키워드입니다.
- Deadlock (교착 상태): 둘 이상의 스레드가 서로가 가진 락이 해제되기만을 무한히 기다리며 멈춰있는 방해 현상입니다.
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 인터페이스 구현 방식이 권장됩니다.