반응형

visibility 2

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는 이 혼란을 ..

반응형