자바로 설정 싱글톤 만들고 있는데 이중검사 락킹(DCL, Double-Checked Locking) 예제들 보면 하나같이 필드에 volatile을 붙여놨더라고요. 처음엔 그냥 관례인가 싶어서 뺐거든요. 근데 왜 굳이 붙이는 건지 이해가 안 돼서요.
제가 쓴 코드는 대충 이런 형태예요.
private static Config instance;
public static Config getInstance() {
if (instance == null) {
synchronized (Config.class) {
if (instance == null) {
instance = new Config();
}
}
}
return instance;
}
제 생각엔 synchronized 블록으로 이미 잠갔으니까 여기 안에서 딴 스레드가 못 들어올 거고, 그럼 volatile 없어도 안전한 거 아닌가 싶은데요. 혹시 저 instance = new Config() 이 한 줄이 문제가 되는 건가요? 그냥 대입 한 줄인데 뭐가 재정렬된다는 건지 감이 안 잡히네요. volatile 붙이는 게 그렇게 손해도 아니라 그냥 붙이면 되긴 하는데 이유를 모르고 쓰긴 찝찝해서요. 아시는 분 설명 좀 부탁드려요.