Hallo zusammen,
ich beschäftige mich gerade mit Singletons, und es wird üblicherweise das Erzeugen mit CS abgesichert,
so wie hier in
Spring4D
Delphi-Quellcode:
class function TSingleton.GetInstance<T>: T;
begin
if not Assigned(TSingleton<T>.fInstance) then
begin
fCriticalSection.Enter;
try
if not Assigned(TSingleton<T>.fInstance) then
TSingleton<T>.fInstance := T.Create;
finally
fCriticalSection.Leave;
end;
end;
Result := TSingleton<T>.fInstance;
end;
Die eigentliche zu kapselnde Klasse <T> muss aber auch threadsicher sein, wenn da mehrere Threads global drauf zugreifen können.
Ich frage mich ob man dafür in einfachen Fällen nicht die bereits bestehende Instanz von fCriticalSection nehmen könnte / sollte.
So sparte man zumindest unnötige CS-Ressourcen in der zu kapselnden Klasse ein.
Das entspräche womöglich nicht einer optimalen Trennung der "Concerns", aber
könnte doch die Ressourcen und Performance optimieren.
Die zu kapselnde Klasse könnte für den Fall von einer speziellen Klasse abgeleitet sein,
z.B. type T = class; für alle nicht sicheren Fälle wie bisher, type T = class(TSingletonThreadsafe);
Abhängig von dem Type der Klasse könnte dann die CS im Create( FCriticalSection ); übergeben werden.
Oder spricht etwas Grundsätzliches dagegen, und es gäbe es sinnvollere Möglichkeiten
das Konstrukt threadsafe zu machen ?