ReentrantReadWriteLock 내부 구조와 AQS 기반 동작 원리
1. ReentrantReadWriteLock가 필요한 이유
ReentrantLock이나 synchronized는 한 시점에 하나의 스레드만 임계 구역에 진입할 수 있는 상호 배제(mutual exclusion) 방식이다. 읽기 연산이 압도적으로 많은 환경에서 모든 접근을 서로 배제하면 목이 발생한다. ReentrantReadWriteLock은 읽기 락(read lock)을 공유하고 쓰기 락(write lock)을 배제함으로써 이 문제를 해 ...
10월 3일 20:03에 게시됨
C# 멀티스레드 환경에서의 컬렉션 동시성 이슈 해결 전략
다중 스레드 요청 처리 시 발생하는 예외 상황
시스템 내에서 외부 호출을 수행하고 그 결과를 바탕으로 특정 이벤트가 실행되도록 설계되는 경우, 이러한 요청 정보를 일시적으로 저장할 수 있는 컨테이너가 필요합니다. 초기 버전에서는 단순한 리스트(List) 타입을 사용하여 요청을 적재하고 조건이 충족되면 발송하는 방식을 적용했습니다. 그러나 여러 스레드에서 동 ...
9월 24일 08:12에 게시됨
Task.Wait의 동작 원리 분석 및 사용 시 주의사항
닷넷(.NET) 환경에서 비동기 작업을 다룰 때, Task 클래스는 필수적인 요소입니다. 특히 Task.Wait 메서드는 특정 Task가 완료될 때까지 현재 스레드를 블로킹하는 기능을 제공합니다. 하지만 일반적으로 Task.Wait는 특별한 경우가 아니라면 사용을 권장하지 않으며, 대신 await 키워드를 사용하는 것이 좋습니다. 이 글에서는 .NET 6 소스 코드를 기반으로 Task.Wait의 ...
9월 15일 20:43에 게시됨
Java volatile 키워드의 원리와 활용
가시성(Visibility) 보장
멀티쓰레드 환경에서 공유 변수의 값 변경 시 다른 쓰레드들에게 변경 사항이 즉시 반영되는 것을 보장합니다. 쓰레드는 작업 시 자신의 로컬 캐시에 데이터를 복사해 사용하는데, volatile 키워드가 선언된 변수는 작업 완료 시 메인 메모리에 즉시 갱신됩니다.
public class VolatileVisibilityTest {
public static void main(String[] ar ...
8월 17일 04:24에 게시됨
자바 J.U.C DelayQueue: 지연 큐의 원리와 활용
DelayQueue는 자바의 동시성 유틸리티 패키지(java.util.concurrent)에 포함된 특별한 형태의 블로킹 큐 구현체입니다. 이 큐의 핵심 기능은 요소들이 정해진 지연 시간 이후에만 소비될 수 있도록 보장한다는 점입니다. 즉, 큐에 삽입된 요소는 특정 만료 시점이 되기 전까지는 소비자 스레드에 의해 가져갈 수 없습니다.
1. DelayQueue의 주요 활용 사례
DelayQueue의 ...
8월 16일 00:07에 게시됨
블로킹 큐를 활용한 생산자-소비자 패턴 구현
전통적인 wait-notify 메커니즘을 활용한 동기화는 코드를 복잡하게 만들기 쉽습니다. java.util.concurrent 패키지의 BlockingQueue 인터페이스는 이러한 동기화 문제를 간결하게 해결해 줍니다. 생산자-소비자(Producer-Consumer) 패턴의 핵심은 자원을 생성하는 생산자의 put() 호출과 자원을 소비하는 소비자의 take() 호출을 제어하는 것입니다. BlockingQueue는 큐가 ...
8월 15일 17:06에 게시됨
자바 스레드 안전하게 종료하기: Deprecated 메서드의 위험성
스레드를 관리하고 종료하는 것은 다중 스레드 프로그래밍에서 매우 중요한 부분입니다. 과거 자바의 Thread 클래스에는 스레드를 멈추거나 일시 중지하는 메서드인 stop()과 suspend()가 제공되었지만, 이들은 현재 모두 Deprecated(사용 중지 권고) 상태입니다. 이 메서드들이 왜 권장되지 않으며, 스레드를 안전하게 종료하기 위한 올바른 방법은 무엇인지 살펴보겠습니 ...
8월 7일 08:51에 게시됨
Java 스레드 생명주기 및 상태 관리
자바에서 스레드는 프로그램 내에서 독립적으로 실행되는 작업 단위를 의미합니다. 동시성 프로그래밍의 핵심 요소인 스레드를 효과적으로 활용하기 위해서는 스레드의 생성 방법, 주요 제어 메서드, 그리고 스레드 상태에 대한 이해가 필수적입니다.
스레드 생성 기법
자바에서 스레드를 생성하는 방법은 크게 세 가지로 나눌 수 있습니다.
1. Thread 클래스 상속
Thre ...
8월 3일 15:50에 게시됨
스레드 풀(Thread Pool) 거부 정책 선정 가이드: 작업 유실 없는 고가용성 시스템 설계
스레드 풀 거부 정책이 실행되는 메커니즘
Java의 ThreadPoolExecutor에서 거부 정책(RejectedExecutionHandler)이 활성화되는 시점은 단순히 '바쁠 때'가 아닙니다. 정확히는 시스템의 처리 용량이 한계에 도달했을 때이며, 다음 세 가지 조건이 모두 충족될 때 발생합니다.
코어 스레드 풀 포화: 설정된 corePoolSize 만큼의 스레드가 모두 실행 중일 때.
대기 ...
7월 31일 10:38에 게시됨
ForkJoinPool의 작업 도둑질(Work Stealing) 알고리즘: 스레드 풀 부하 균형 조정 방법
ForkJoinPool의 작업 도둑질(Work Stealing) 알고리즘: 스레드 풀 부하 균형 조정 방법
ForkJoinPool에서 중요한 작업 도둑질 알고리즘에 대해 자세히 알아보겠습니다. ForkJoinPool은 Java의 java.util.concurrent 패키지에서 제공하는 분할 정복(Divide and Conquer) 방식을 사용하여 작업을 처리하는 스레드 풀입니다. 이 알고리즘 덕분에 다중 스레드 환경에서 작업 부 ...
7월 27일 18:07에 게시됨