[JAVA] 스레드 안전한 공유 객체를 만드는 세 가지 축: 불변, 공개, confinement
·
Language/Java
1. 이 글에서 정리할 것이 글은 공유 객체를 어떻게 설계·공개해야 안전한가를 JMM(Java Memory Model)과 JIT 관점까지 엮어서 정리한 것이다. 핵심 축은 세 가지다.공유 가변 상태를 가능한 줄이고, 불변/결과적 불변으로 최대한 끌어올릴 것객체를 어떻게 공개하느냐(safe publication) 를 설계에 포함할 것아예 공유하지 않을 수 있을 때는 thread confinement로 escape 자체를 막을 것2. 공유 상태의 세 단계: 불변 / 결과적으로 불변 / 가변공유 상태는 다음 세 수준으로 나눠서 보는 게 이해가 쉽다.2.1 완전 불변(Immutable)조건은 세 가지 정도로 정리할 수 있다.생성 이후 상태가 절대 변하지 않는다 (setter 없음, 내부 가변 구조도 변경되지 않..
[JAVA] 자바 동시성 프로그래밍: 기초부터 메모리 모델, 설계 전략까지 한 번에 정리하기
·
Language/Java
1. 왜 이 글을 쓰는가?단일 스레드 환경에서는 코드가 위에서 아래로 순차적으로 실행되기 때문에 상태 변화를 추적하기 쉽다. 하지만 멀티코어 환경에서 여러 스레드가 동시에 실행되면, CPU 캐시와 메인 메모리 사이의 데이터 불일치로 인해 예상치 못한 버그가 발생한다. 단순히 synchronized 를 쓰면 안전하다고 외우기보다, 자바 메모리 모델(JMM)이 어떻게 작동하고 JVM 내부에서 스레드와 모니터 락이 어떤 구조로 관리되는지를 정리하는 것이 목적이다. 이 글은 다음 질문들에 답하는 것을 목표로 한다.왜 스레드를 늘린다고 무조건 성능이 좋아지지 않는가? (암달의 법칙)자바 스레드의 실제 상태는 어떻게 변하며 인터럽트는 왜 중요한가?JMM의 Happens-Before 관계란 무엇인가?synchroni..