반응형

java memory model 3

volatile은 무엇을 보장하고, 무엇을 보장하지 않는가?

volatile은 Java 동시성에서 가장 많이 오해되는 키워드 중 하나다.“volatile을 쓰면 스레드 안전해진다”, “락 없이도 안전하다”는 설명은 부분적으로만 맞고, 대부분의 경우는 틀리다.이 글에서는 volatile이 정확히 무엇을 보장하는지, 그리고 무엇을 절대 보장하지 않는지를 Java Memory Model 기준으로 정리한다.1. volatile은 왜 존재하는가?volatile의 존재 이유는 단순하다. 한 스레드에서 변경한 값을 다른 스레드에서 반드시 보이게 만들기 위함 즉, volatile은 가시성(visibility) 문제를 해결하기 위한 도구다.동기화 없이 공유되는 일반 변수는, 다음이 보장되지 않는다.언제 값이 메모리에 반영되는가다른 스레드에서 그 값을 언제 읽는가volatile은 ..

Java Memory Model - happens-before의 정확한 의미

Java 동시성을 이해하는 데 있어 가장 중요한 개념은 happens-before다.하지만 happens-before는 “먼저 실행된다”거나 “순서가 보장된다”는 말로 자주 오해된다.이 글에서는 happens-before가 무엇을 보장하고, 무엇을 보장하지 않는지를 Java Language Specification 기준으로 정리한다.1. 왜 happens-before가 필요한가?멀티스레드 환경에서 다음 질문은 항상 따라온다.한 스레드에서 쓴 값은 언제 다른 스레드에서 보이는가?코드에 작성한 순서가 실제 실행 순서와 같은가?직관적으로는 “먼저 실행했으니, 먼저 보일 것” 처럼 느껴진다.하지만 실제로는CPU 캐시컴파일러 최적화JIT 재정렬때문에 이 직관은 쉽게 깨진다.happens-before는 이 혼란을 ..

Java Concurrency는 무엇을 보장하는가?

Java에서 동시성 문제는 종종 “멀티스레드가 어려워서” 발생한다고 설명된다.하지만 문제의 본질은 복잡한 문법이나 API가 아니라, 무엇이 보장되고 무엇이 보장되지 않는지를 명확히 이해하지 못한 상태에서 코드를 작성하는 데 있다.이 글에서는 Java가 동시성 환경에서 무엇을 보장하는지, 그리고 무엇을 의도적으로 보장하지 않는지를 공식 문서 기준으로 정리한다.1. 동시성 문제는 어디서 발생하는가?동시성 문제는 여러 스레드가 같은 데이터에 동시에 접근할 때 발생한다.문제는 단순히 “동시에 실행된다”는 사실이 아니라,어떤 값이 언제 보이는가실행 순서가 어떻게 재배치되는가한 스레드의 결과를 다른 스레드가 신뢰할 수 있는가를 알 수 없다는 점이다.이 불확실성은CPU 캐시컴파일러 최적화JIT재정렬(Reorderin..

반응형