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