Эквир Синглтон класс Экземпляр Многопоточность

Чтобы получить экземпляр класса с шаблоном Singleton, я хочу использовать следующую функцию:

Это эскиз

interface

uses SyncObjs;

type
  TMCriticalSection = class(TCriticalSection)
  private
    Dummy : array [0..95] of Byte;
  end;

var
  InstanceNumber : Integer;
  AObject: TObject;
  CriticalSection: TMCriticalSection;

function getInstance: TObject;

implementation

uses Windows;

function getInstance: TObject;
begin
   //I Want somehow use InterlockedCompareExchange instead of CriticalSession, for example

   if InterlockedCompareExchange(InstanceNumber, 1, 0) > 0 then
   begin
     Result := AObject;
   end
   else
   begin
      CriticalSection.Enter;
      try
        AObject := TObject.Create;
      finally
        CriticalSection.Leave;
      end;
      InterlockedIncrement(InstanceNumber);
      Result := AObject
   end;
end;

initialization
  CriticalSection := TMCriticalSection.Create;
  InstanceNumber := 0;

finalization;
  CriticalSection.Free;

end.

Три вопроса:

1- Является ли этот дизайн Thread Thread? Особенно с InterlockedExchange Part.
2- Как использовать InterlockedCompareExchange? Можно ли сделать то, что я пытаюсь?
3- Является ли этот дизайн лучше, чем задействовать весь код в области критического раздела?

Замечание: Мой объект является потокобезопасным, только конструкция, которую мне нужно сериализовать!
Это не интимный код, а только важная часть, я имею в виду, функция getInstance.

редактировать

I НУЖНО использовать какой-то одноэлементный объект.
Есть ли способ использовать InterlockedCompareExchange для сравнения, если значение InstanceNumber равно нулю?
А также
1 - Создайте объект только когда 0, иначе верните экземпляр.
2 - Когда значение равно 0: введите в критическом разделе. Создать объект. Оставьте критический раздел.
3 - Было бы лучше сделать это, вместо того, чтобы включать весь код в область критического раздела?