2026/05 3

[TIL] Java 멀티스레드 - 생산자 소비자 문제와 wait/notify (2026.05.07)

오늘 배운 것멀티스레드 환경에서 가장 자주 등장하는 패턴인 생산자-소비자 문제와, 이를 해결하기 위한 Object.wait() / notify() 메커니즘을 학습했다.생산자-소비자 문제란?생산자(Producer)는 데이터를 만들어 버퍼에 넣고, 소비자(Consumer)는 버퍼에서 데이터를 꺼내 처리한다. 버퍼는 한정된 공간이기 때문에 두 가지 상황이 문제가 된다.버퍼가 가득 찼을 때 생산자가 계속 넣으려 하면 데이터 유실버퍼가 비었을 때 소비자가 계속 꺼내려 하면 null 처리 또는 무한 루프단순히 synchronized만 붙인다고 해결되는 문제가 아니다. 스레드 간 협력(cooperation)이 필요하다.V1 - 단순 구현 (데이터 유실 발생)가장 먼저 시도할 수 있는 방법은 synchronized로 ..

JAVA 2026.05.08

[TIL] Java 멀티스레드 - LockSupport와 ReentrantLock (2026.05.06)

오늘 배운 것synchronized의 한계를 극복하기 위해 핵심인 LockSupport와 ReentrantLock에 대해 학습했다.synchronized의 한계 복습단점 내용무한 대기BLOCKED 상태에서 타임아웃·인터럽트 없이 락이 풀릴 때까지 무한 대기공정성 없음어떤 스레드가 락을 먼저 얻는지 보장 안 됨 → 기아 현상 가능 LockSupport스레드를 직접 WAITING / TIMED_WAITING 상태로 제어하는 저수준 유틸리티.LockSupport.park(); // RUNNABLE → WAITINGLockSupport.parkNanos(2_000_000_000L); // RUNNABLE → TIMED_WAITING (2초)LockSupport.unpark(thre..

JAVA 2026.05.06

[TIL] Java 멀티스레드 - synchronized와 임계 영역 (2026.05.04)

동시성 문제란?여러 스레드가 같은 공유 자원(인스턴스 필드 등)에 동시에 접근할 때 발생한다.잔액 1000원 계좌에 t1, t2가 동시에 800원 출금을 시도하는 예제에서 두 가지 문제가 나타났다.케이스 1 - t1이 약간 먼저 실행t1이 잔액 검증(1000 >= 800) 통과 후 아직 balance를 줄이지 않은 상태t2도 잔액 1000으로 검증 통과결과: t1 출금 후 잔액 200, t2 출금 후 잔액 -600 (마이너스 발생)케이스 2 - t1, t2 완전히 동시 실행둘 다 balance=1000 읽음 → 둘 다 1000-800=200 계산 → 둘 다 balance=200 저장결과: 1600원이 빠져나갔는데 잔액은 200원 (800원 증발)volatile로는 해결 안 된다. 메모리 가시성 문제만 해..

JAVA 2026.05.04