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에 게시됨

Fork/Join 프레임워크 실전 활용 예제

Fork/Join 프레임워크를 활용한 계산 예제 Fork/Join 프레임워크는 Java에서 병렬 처리를 구현하는 데 강력한 도구이다. 이 프레임워크는 작업을 작은 하위 작업으로 분할(fork)하고, 각 하위 작업의 결과를 결합(join)하는 방식으로 작동한다. 특히 재귀적인 알고리즘에서 그 진가를 발휘한다. 예제 1: 피보나치 수열 n번째 항 계산 피보나치 수열은 대표적인 선형递推 ...

7월 26일 15:47에 게시됨

Callable 및 FutureTask 인터페이스를 활용한 Java 스레드 구현

JDK 5.0부터 Java는 Runnable 인터페이스의 한계를 보완하고 스레드 작업의 결과 반환 및 예외 처리를 강화하기 위해 Callable 인터페이스와 FutureTask 클래스를 도입했습니다. 이들을 활용하면 스레드가 비동기적으로 작업을 수행하고, 작업 완료 후 결과를 호출 스레드로 전달할 수 있는 보다 유연한 멀티스레드 프로그래밍이 가능해집니다. Callable 및 FutureTask를 ...

7월 26일 12:48에 게시됨

async-await 구현: Rust로 만든 간단한 런타임

Rust의 런타임이 어떻게 작동하는지 이해하기 위해 최소한의 외부 의존성 없이 간단한 런타임을 구현했습니다. 이 런타임은 복잡한 스케줄링 알고리즘 없이 단일 전역 작업 큐를 사용합니다. 다음 코드는 멀티 프로듀서, 멀티 컨슈머(MPMC) 부분만 crossbeam 크레이트를 사용하고 나머지는 직접 작성했습니다. 예제 코드: fn main() { let runtime = SimpleRuntime::ne ...

7월 24일 17:58에 게시됨