[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..
[Java] Map의 computeIfAbsent()과 computeIfPresent() 메서드
·
Java & Spring
1️⃣ 들어가며ConcurrentHashMap을 사용할 때 get과 put만 쓰고 있다면?실제로는 더 안전하고 효율적인 방법이 있다: 바로 computeIfAbsent, computeIfPresent이 글에서는 이 메서드들이 왜 동시성 환경에서 필수적인지 설명한다📌 미리 읽으면 이해가 편해요!아래 블로그 글에서 ConcurrentHashMap의 기본 개념과 동작 원리를 먼저 살펴보는 것을 추천합니다:https://20s-hoon.tistory.com/166 [Java] Java의 ConcurrentHashMap 정리1️⃣ ConcurrentHashMap이란?Java에서 멀티스레드 환경을 다루다 보면, 여러 스레드가 동시에 하나의 Map에 접근하는 상황이 자주 발생한다. 이때 단순히 HashMap을 사용..
[Java & Spring] HashMap vs ConcurrentHashMap, 실습으로 알아보는 차이
·
Java & Spring
1️⃣ 들어가며멀티스레드 환경에서 데이터를 안전하게 공유하기 위해 어떤 Map을 사용해야 할까?이전에 작성한 글 🔗ConcurrentHashMap 정리을 먼저 읽어보면,ConcurrentHashMap이 어떤 자료구조이고 왜 필요한지를 이론적으로 이해하는 데 도움이 된다. 이번 글에서는 그 내용을 실습을 통해 직접 확인해보려 한다.같은 코드, 같은 로직에서 Map만 HashMap으로 바꿨을 때 무슨 일이 벌어지는지 테스트를 통해 명확하게 보여줄 것이다.🧩 실습 목표ConcurrentHashMap을 사용한 경우와HashMap을 사용한 경우를 비교하여멀티스레드 환경에서 어떤 문제가 발생하는지를 실질적으로 검증한다단순히 "thread-safe하지 않다"는 말로는 와닿지 않는 부분을, 100개의 쓰레드가 동시..
[Java] Java의 ConcurrentHashMap 정리
·
Java & Spring
1️⃣ ConcurrentHashMap이란?Java에서 멀티스레드 환경을 다루다 보면, 여러 스레드가 동시에 하나의 Map에 접근하는 상황이 자주 발생한다. 이때 단순히 HashMap을 사용할 경우, 데이터 충돌이나 예기치 못한 동작이 발생할 수 있다. 그 이유는 HashMap이 기본적으로 thread-safe 하지 않기 때문이다. 이 문제를 해결하기 위해 등장한 것이 ConcurrentHashMap이다. ConcurrentHashMap은 java.util.concurrent 패키지에 포함되어 있으며, 멀티스레드 환경에서 안전하게 데이터를 읽고 쓸 수 있도록 설계된 Map 구현체이다. 기존의 Hashtable보다 더 효율적이고, Collections.synchronizedMap보다 세밀한 동기화를 제공한..