В статье Википедии о Singletons упоминаются несколько потокобезопасных способов реализации структуры на Java. Для моих вопросов позвольте рассмотреть синглтоны, которые имеют длительные процедуры инициализации и получают сразу несколько потоков.
Во-первых, этот безответный метод потокобезопасен, и если да, то что он синхронизирует?
public class Singleton {
private Singleton instance;
private Singleton() {
//lots of initialization code
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
Во-вторых, почему следующий поток реализации безопасен и ленив при инициализации? Что именно происходит, если два потока входят в метод getInstance()
в то же время?
public class Singleton {
private Singleton() {
//lots of initialization code
}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
Наконец, во втором примере, если один поток получает экземпляр первым, а другой поток получает экземпляр и пытается выполнить действия над ним до того, как конструктор закончил в первом потоке? Можете ли вы попасть в небезопасное состояние?