Я много читал о синглетонах, когда их следует и не следует использовать, и как их безопасно применять. Я пишу на С++ 11 и натолкнулся на ленивую инициализованную Meyer реализацию синглтона, как видно из этого вопроса.
Эта реализация:
static Singleton& instance()
{
static Singleton s;
return s;
}
Я понимаю, как это защищено от других вопросов здесь, на SO, но я не понимаю, как это на самом деле одноэлементный шаблон. Я реализовал синглтоны на других языках, и они всегда заканчиваются чем-то вроде этого примера из Википедии:
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo .class){
if (instance == null) {
instance = new SingletonDemo ();
}
}
}
return instance;
}
}
Когда я смотрю на этот второй пример, становится очень интуитивно понятно, как это синглтон, поскольку класс содержит ссылку на один экземпляр самого себя и только когда-либо возвращает этот экземпляр. Однако в первом примере я не понимаю, как это предотвращает существование двух экземпляров объекта. Итак, мои вопросы:
- Как в первой реализации применяется одноэлементный шаблон? Я предполагаю, что это связано с ключевым словом static, но я надеюсь, что кто-то сможет подробно объяснить мне, что происходит под капотом.
- Между этими двумя стилями реализации один предпочтительнее другого? Каковы плюсы и минусы?
Спасибо за любую помощь,