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

Чтобы получить экземпляр класса с шаблоном 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- Является ли этот дизайн Резьба Безопасной? Особенно с InterlockedExchange Part.

2- Как использовать InterlockedCompareExchange? Можно ли делать то, что яя пытаюсь?

3- Является ли этот дизайн лучше, чем задействовать весь код в области критического раздела?

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

Это не интимный код, а только важная часть, я имею в виду, функция getInstance.

Editi

НЕОБХОДИМОСТЬ использовать какой-то одноэлементный объект.

Есть ли способ использовать InterlockedCompareExchange для сравнения, если значение InstanceNumber равно нулю?

А также

1 - Создайте объект только когда 0, иначе верните экземпляр.

2 - Когда значение равно 0: введите в критическом разделе. Создать объект. Оставьте критический раздел.

3 - Было бы лучше сделать это, вместо того, чтобы включать весь код в область критического раздела?

Ответы на вопрос(2)

Ваш ответ на вопрос