代码之家  ›  专栏  ›  技术社区  ›  RBA

Delphi单例双重检查锁定

  •  3
  • RBA  · 技术社区  · 7 年前

    我想实现一个单例关键部分,以便跨多个类保护一些代码(不要再问了…)。我见过 Delphi Singleton Pattern Aquire Singleton class Instance Multithread 但是它们使用一个全局函数来返回单例,我不希望这样。因此,我实现了自己的版本:

    unit SynchronizationHandler;
    
    interface
    
    uses
      SyncObjs;
    
    type
      TSynchronizationHandler = class
      strict private
        FCriticalSection: TCriticalSection;
      private
        class var FSingletonCriticalSection: TCriticalSection;
        class var FInstance: TSynchronizationHandler;
      public
        constructor Create;
        destructor Destroy; override;
    
        procedure Lock;
        procedure Release;
        class function Instance: TSynchronizationHandler;
      end;
    
    implementation
    
    { TSynchronizationHandler }
    
    constructor TSynchronizationHandler.Create;
    begin
      FCriticalSection := TCriticalSection.Create;
    end;
    
    destructor TSynchronizationHandler.Destroy;
    begin
      FCriticalSection.Destroy;
    end;
    
    {Doublec check locking for this singletone}
    class function TSynchronizationHandler.Instance: TSynchronizationHandler;
    begin
      if not Assigned(FInstance) then
       begin
        FSingletonCriticalSection.Acquire;
        try
          if not Assigned(FInstance) then
            FInstance := TSynchronizationHandler.Create;
        finally
          FSingletonCriticalSection.Release;
        end;
      end;
    
      Result := FInstance;
    end;
    
    procedure TSynchronizationHandler.Lock;
    begin
      FCriticalSection.Acquire;
    end;
    
    procedure TSynchronizationHandler.Release;
    begin
      FCriticalSection.Release;
    end;
    
    initialization
      TSynchronizationHandler.FSingletonCriticalSection := TCriticalSection.Create;
    
    finalization
      if Assigned(TSynchronizationHandler.FInstance) then
        TSynchronizationHandler.Instance.Free;
    
      TSynchronizationHandler.FSingletonCriticalSection.Free;
    
    end.
    

    它正在工作,但我不喜欢初始化\终结部分。有没有其他方法可以在不使用全局变量和函数的情况下实现这一点?

    1 回复  |  直到 7 年前
        1
  •  4
  •   David Heffernan    7 年前

    如果希望将所有必需的代码封装在类的命名空间中,那么可以替换 initialization finalization 带有 class constructor class destructor 分别地这些将从单元隐式调用 定稿 程序。