Aquire Singleton-Klasse Instance Multithread

Um die Instanz der Klasse mit Singleton-Muster zu erhalten, möchte ich die folgende Funktion verwenden:

Dies ist eine Skizze

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.

Drei Fragen:

1- Ist dieser Design-Thread sicher? Besonders das mit InterlockedExchange Part.
2- Wie verwende ich den InterlockedCompareExchange? Ist es möglich zu tun, was ich versuche?
3- Ist dieses Design besser, als den gesamten Code innerhalb des Bereichs des kritischen Abschnitts einzubeziehen?

Bemerkung: Mein Objekt ist threadsicher, nur die Konstruktion muss serialisiert werden!
Dies ist nicht der gesamte Code, sondern nur der wichtige Teil, ich meine, die Funktion getInstance.

Bearbeiten

I BRAUCHEN um eine Art Singleton-Objekt zu verwenden.
Gibt es eine Möglichkeit, InterlockedCompareExchange zum Vergleichen zu verwenden, wenn der Wert von InstanceNumber Null ist?
Und
1 - Erstellen Sie das Objekt nur, wenn 0 ist, andernfalls geben Sie die Instanz zurück.
2 - Wenn der Wert 0 ist: Geben Sie den kritischen Bereich ein. Erstellen Sie das Objekt. Kritischen Bereich verlassen.
3 - Wäre es besser, dies zu tun, anstatt den gesamten Code innerhalb des Bereichs des kritischen Abschnitts einzubeziehen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage