[Java & Spring] ReentrantLock, 쿠폰 발급으로 실습하고 테스트 코드로 증명해보기
·
Java & Spring
1️⃣ 들어가며"한 명에게만 줘야 하는 쿠폰인데, 어떻게 두 명이 받았지?" 이런 상황, 개발을 하며 정말 자주 접하게 됩니다. 특히 선착순 쿠폰, 이벤트 응모, 재고 1개 남은 상품 구매와 같은 케이스에서는 "빠르게 두 번 클릭했더니 쿠폰이 두 장 발급됐다(따닥 이슈)", "100명 이벤트인데 101명이 응모 완료했다" 같은 문제가 벌어지곤 하죠. 이번 글에서는 이 문제를 실험으로 명확하게 확인하고, Java에서 제공하는 ReentrantLock을 통해 동시성 문제를 어떻게 해결할 수 있는지 단계적으로 살펴보려 합니다. 이전에 작성한 글 🔗ReentrantLock 정리와 🔗HashMap vs ConcurrentHashMap을 먼저 읽어보면 해당 글을 이해하는데 도움이 됩니다!!🧩 실습 목표실험을 ..
[Java] ReentrantLock 정리 (feat. synchronized)
·
Java & Spring
1️⃣ ReentrantLock 개요🔧 등장 배경멀티스레드 환경에서 공유 자원을 안전하게 다루기 위해 자바는 오래전부터 synchronized 키워드를 제공해왔다. 하지만 단순하고 자동화된 방식 뒤에는 유연성 부족, 디버깅 어려움, 조건 분기 처리 미지원 등의 문제가 있었다.❓ 왜 필요했을까? (synchronized의 한계)락 획득 시 타임아웃을 설정할 수 없음대기 중인 스레드를 interrupt할 수 없음조건을 나눠서 기다리기 어려움 (단일 wait/notify만 존재)락 제어가 블록 단위로만 가능하고 가시성이 낮음🧩 Synchronized vs ReentrantLock 비교구분SynchronizedReentrantLock🔐 락 획득/해제 방식암시적 (자동)명시적 (lock() / unlock..