Trotzdem fällt mir kein sinnvoller Fall ein, in dem das explizite Schützen des Konstruktors helfen sollte. Denn wie du selbst sagst, dazu müssten zwei Threads gleichzeitig das selbe (und nicht nur das gleiche) Objekt erzeugen, was ausgeschlossen ist.
Das mit den 2 Threads, die die gleiche Objekt-
Instanz erzeugen, war als Antwort auf himitsu's Anmerkung, dass die Erzeugung der CS-Instanz nicht Thread-Safe ist und ich damit eigentlich nur aufzeigen wollte, dass dieser Fall nur in der Theorie vorkommen kann.
Der Schutz des Konstruktors wird dann wichtig, wenn man z.B. eine Klasse erzeugt, die z.B. einen Thread-Pool erstellt und diesem Thread-Pool auch sich selbst als Referenz mitgibt.
Hiermal als völlig ungeschützte Klasse:
Delphi-Quellcode:
TMyThreadPool = class
private
_Pool : TList<TPoolThread>;
public
constructor Create( PoolSize : integer );
// Some Properties ...
end;
constructor TMyThreadPool.Create;
begin
inherited Create;
_Pool := TObjectList<TPoolThread>.Create;
while _Pool.Count < PoolSize do
_Pool.Add( TPoolThread.Create( Self ) );
// Init Some Properties
end;
Mit meiner Lösung bekomme ich die Klasse 100% Thread-Safe mit relativ geringem Aufwand.
Eine Ableitung von der Klasse TMyThreadPool geht auch sehr charmant und bleibt 100% Thread-Safe