Java3 Double-Checked Locking에서 volatile이 필요한 이유 배경이번 글에서는 Java 싱글톤 구현에서 자주 나오는 Double-Checked Locking과 volatile의 관계를 정리해 보겠다. Double-Checked Locking은 싱글톤 객체를 지연 초기화할 때 사용하는 패턴이다. 여기서 중요한 코드는 아래 한 줄이다.private static volatile Singleton instance;이때 volatile은 단순히 “최신 값을 보기 위해서”만 사용하는 것이 아니다. 더 중요한 이유는 객체 생성 과정에서 발생할 수 있는 재정렬 문제를 막고, 다른 스레드가 완전히 초기화된 객체만 보도록 하기 위해서다. 기본 싱글톤 구현가장 단순한 싱글톤은 아래처럼 만들 수 있다.class Singleton { private static Singleton i.. 2026. 6. 18. Java synchronized와 메모리 가시성 이해하기 배경이번 글에서는 Java의 synchronized가 왜 필요한지, 특히 메모리 가시성(memory visibility) 관점에서 정리해 보겠다.멀티스레드 코드를 처음 보면 이런 생각을 하기 쉽다.같은 객체의 필드를 보고 있으니까, 한 스레드가 값을 바꾸면 다른 스레드도 바로 알 수 있지 않을까?하지만 실제로는 그렇지 않을 수 있다. Java 프로그램은 단순히 코드 그대로 실행되지 않는다. 실행 과정에서 여러 단계가 개입된다.Java 코드→ JIT 컴파일러 최적화→ CPU 명령어→ CPU cache / register→ 메인 메모리각 스레드는 값을 메인 메모리에서 매번 읽는 것이 아니라, CPU 캐시나 레지스터에 보관한 값을 사용할 수 있다. 그래서 한 스레드가 값을 변경했더라도, 다른 스레드가 그 변경.. 2026. 6. 18. Reactor publishOn()은 병렬 처리 도구가 아니다 Reactor publishOn()은 병렬 처리 도구가 아니라 실행 위치를 바꾸는 연산자다Reactive 코드를 보다 보면 publishOn()은 꽤 자주 등장한다. 그런데 이 연산자는 이름만 보면 “이제 다른 스레드에서 알아서 병렬 처리되겠구나”처럼 읽히기 쉽다. 실제로는 조금 다르다. publishOn()은 파이프라인 전체를 병렬화하는 연산자가 아니라, 자기 아래 구간의 실행 스레드를 바꾸는 연산자에 가깝다. Reactor 공식 가이드도 publishOn과 subscribeOn을 비교하면서, publishOn()은 체인 안에서 위치가 중요하고, 그 아래쪽 연산자들의 실행 컨텍스트를 바꾼다고 설명한다.배경Reactor에서는 아무 일도 구독 전에는 일어나지 않는다. 그리고 구독이 시작되면 subscrib.. 2026. 3. 29. 이전 1 다음