То же самое обоснование , которое Дейв дает деструктору, применяется к конструктору. Пока объект все еще создается, к нему не должен обращаться другой поток. Гарантируется, что конструктор будет запускаться только одним потоком (вы не можете создать его дважды), но вы должны гарантировать, что ни один поток не получит доступ к объекту до того, как он будет полностью построен.
Внутренние блокировки никогда не должны быть обязанностью конструкторов или деструкторов за доступ к данным. Они могут использоваться в деструкторах для синхронизации потока: если объект уже внутри объекта (поток выполняет один из ваших методов объекта), чтобы гарантировать, что вы не удалите объект в середине работа.
Это общий рецепт для всех типов классов с использованием конструктора и деструктора , используемого в языковом смысле. Теперь с синглетами сценарий немного более конкретен. Обычно, когда вы говорите о конструкторе синглтона, вы фактически говорите о статическом методе, который создает объект, но не о реальном конструкторе . Этот статический метод обычно имеет механизмы синхронизации, которые могут включать статический мьютекс.
Прежде чем углубляться в дискуссии о том, что такое уничтожение синглтона, вы должны указать, каково ваше предназначение. Будет ли синглтон уничтожен и воссоздан много раз за время существования приложения? Будет ли он создан один раз и жить вечно? Как вы реализуете синглтон? Эти вопросы являются отправной точкой для принятия решения о том, когда, где и когда вам нужны примитивы синхронизации.