public class Factory {
private Singleton instance;
public Singleton getInstance() {
Singleton res = instance;
if (res == null) {
synchronized (this) {
res = instance;
if (res == null) {
res = new Singleton();
instance = res;
}
}
}
return res;
}
}
Это почти правильная реализация потокобезопасного Singleton
. Единственная проблема, я вижу:
Поток thread #1
который инициализирует поле instance
может быть опубликован до того, как он будет полностью инициализирован. Теперь второй поток может читать instance
в несогласованном состоянии.
Но для моего глаза это только проблема. Это только проблема? (И мы можем сделать instance
volatile).