【问题标题】:Delphi Singleton double check lockingDelphi Singleton 双重检查锁定
【发布时间】:2019-01-08 21:10:13
【问题描述】:

我想实现一个单例临界区,以保护跨多个类的一些代码(不要再问了.​​.....)。我见过Delphi Singleton PatternAquire 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.

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

【问题讨论】:

  • 很难看出持有锁的全局变量有什么好处。
  • 我尽量避免使用全局变量。任何类型的......
  • 你的班级有两个。
  • 是的,链接到班级。未定义为 globalvar:FromWhereIsThisComming :)
  • 但这只是全局变量的不同语法。只是糖。如果你不喜欢初始化和终结,那么你可以用类构造函数和类析构函数替换它们,它们被初始化和终结过程隐式调用。这就是你反对的,在课堂之外有代码的事实吗?您希望它是独立的吗?

标签: multithreading delphi singleton delphi-10.1-berlin


【解决方案1】:

如果您想将所有必要的代码封装在类的命名空间中,那么您可以将initializationfinalization 部分分别替换为class constructorclass destructor。这些将在单元initializationfinalization 过程中被隐式调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多