왜 스레드 풀 사이즈가 동시성 테스트의 신뢰도를 결정하나?
내 테스트는 정말 동시성을 검증하고 있는가? 동시성 제어 로직을 작성하고 나면, 반드시 테스트 코드를 통해 이를 검증해야 한다. 그런데 이때 스레드 풀(Thread Pool)의 크기를 대충 설정하면, 로직에 버그가 있음에도 불구하고 테스트가 통과되는 문제가 발생할 수 있다. 왜 이런 일이 발생하는지, 그리고 적절한 스레드 숫자는 어떻게 정해야 하는지...
내 테스트는 정말 동시성을 검증하고 있는가? 동시성 제어 로직을 작성하고 나면, 반드시 테스트 코드를 통해 이를 검증해야 한다. 그런데 이때 스레드 풀(Thread Pool)의 크기를 대충 설정하면, 로직에 버그가 있음에도 불구하고 테스트가 통과되는 문제가 발생할 수 있다. 왜 이런 일이 발생하는지, 그리고 적절한 스레드 숫자는 어떻게 정해야 하는지...
이 글은 비동기 처리를 공부하던 중, ‘왜 하필 Completable이라고 명명했을까?’라는 순수한 호기심에서 시작되었습니다. 이해를 돕기 위한 상황 예시와 코드는 정리 과정에서 Claude, Gemini의 도움을 받아 작성했습니다. 비동기 처리, 이렇게까지 복잡해야 할까? 비동기 처리는 @Async 어노테이션 하나면 다 되는 줄 알았는데, 실무에...
ConcurrentHashMap은 Java에서 스레드 안전한 맵(Map)을 구현할 때 가장 먼저 고려되는 표준 컬렉션이다. Java 8에서 ConcurrentHashMap은 기존의 세그먼트(Segment) 락 방식에서 벗어나, CAS(Compare-And-Swap) 연산과 버킷 레벨 락(Bucket-level Lock)을 결합한 정교한 방식으로 재설계...
Synchronized Collection 특징 [동기화 방식: 컬렉션 전체에 단일 락] Synchronized 컬렉션은 add, get, remove 등 데이터에 접근하는 모든 메서드에 synchronized키워드를 사용한다. 이는 컬렉션 객체 전체를 단 하나의 락(Lock)으로 제어하는 ‘전체 잠금(Single Global Lock)’ 방식으로, ...
스레드를 멈추지 않고 하드웨어 수준의 원자적 연산을 통해 동시성을 제어하는 Lock-Free 알고리즘은 병렬 프로그래밍의 핵심 기술이다. Lock-Free 알고리즘은 다음 포스트에서 다루었다. https://park0691.github.io/posts/java-cas-atomic/ 하지만 이 기법의 이면에는 ABA 문제라는 치명적인 함정이 숨어있...
기존 Lock 방식의 한계 Semaphore, Mutex, synchronized와 같은 전통적인 락 기반 동기화 기법들은 한 스레드가 임계 영역(Critical Section)의 실행을 독점한다. 이러한 방식은 스레드 안전성을 보장하지만 다음과 같은 근본적인 한계를 가진다. 블로킹 blocking과 컨텍스트 스위칭으로 인한 성능 저하 ...
Memory Visibility, 가시성 멀티 스레드 환경에서 스레드는 각자의 캐시를 가지는 다른 프로세서에 할당되어 병렬 실행될 수 있다. 스레들이 하나의 변수를 공유하면 각 프로세서의 캐시는 변수의 복사본을 소유하게 된다. 이 때, 여러 스레드에 의해 캐시에 있는 공유 변수에 읽고 쓰는 연산이 수행되면 캐시가 불일치되는 문제(동일한 변수임에도 각 ...
요약 이번 포스트에서는 다음 내용을 위주로 살펴본다. 해시맵이 체이닝 방식으로 동일한 버킷에 어떻게 여러 엔트리를 저장하는지 알아본다. 이미 존재하는 키에 새로운 값을 저장할 때, 해시맵이 기존 값을 어떻게 덮어쓰는지 알아본다. hashCode()와 equals()가 어떻게 활용되어 기존 키와 새 키를 비교할까? 해시 버킷에의 엔트리...
HashMap, 그 익숙함 속의 깊이 Java 개발자라면 HashMap은 매우 익숙한 컬렉션이다. 키-값 쌍으로 데이터를 저장하고 빠르게 조회할 수 있어 자주 사용하곤 한다. 하지만 이 HashMap이 내부적으로 어떻게 동작하는지, 데이터가 어떤 과정을 거쳐 저장되고 관리되는지 깊이 들여다본 경험은 얼마나 될까? 사실 HashMap은 우리가 흔히 사용...
이번 포스트에서는 MS-SQL에서 여러 행의 문자열을 합치는 방법에 대해 알아보고자 한다. 예시 데이터 CREATE TABLE #TMP_TBL( JOB VARCHAR(30) , ENAME VARCHAR(30) ); INSERT INTO #TMP_TBL VALUES ('PRESIDENT', 'KING') , ('MANAGER', 'CLARK')...