не дублируется.Это проверяется снова, потому что между первой проверкой if(instance == null)
и блокировкой synchronized(Singleton.class)
другой поток может создать его экземпляр и сломать синглтон.Проверьте разницу между первым кодовым блоком и вторым.
public static Singleton getInstance(){
if(instance == null){
// Another thread could instantiate in this moment.
synchronized(Singleton.class){
instance = new Singleton(); // If another thread did already instantiate it, this would be the second call to the constructor.
}
}
return instance;
}
Повторная проверка после того, как блокировка была выполнена, предотвращает это состояние гонки.
public static Singleton getInstance(){
if(instance == null){
// Another thread could instantiate in this moment.
synchronized(Singleton.class){
// Now this code is thread safe
if(instance == null){
// No other thread made a race condition before the first check and the locking. We can safely do the heavy work.
instance = new Singleton();
}
}
}
return instance;
}