【发布时间】:2019-01-08 21:10:13
【问题描述】:
我想实现一个单例临界区,以保护跨多个类的一些代码(不要再问了......)。我见过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.
它正在工作,但我不喜欢初始化\最终化部分。有没有其他方法可以在不使用全局变量、函数的情况下实现这一点?
【问题讨论】:
-
很难看出持有锁的全局变量有什么好处。
-
我尽量避免使用全局变量。任何类型的......
-
你的班级有两个。
-
是的,链接到班级。未定义为 globalvar:FromWhereIsThisComming :)
-
但这只是全局变量的不同语法。只是糖。如果你不喜欢初始化和终结,那么你可以用类构造函数和类析构函数替换它们,它们被初始化和终结过程隐式调用。这就是你反对的,在课堂之外有代码的事实吗?您希望它是独立的吗?
标签: multithreading delphi singleton delphi-10.1-berlin